Commit 066496df authored by Vasyl Bodnaruk's avatar Vasyl Bodnaruk Committed by Andrii Marynets

remake pages

parent 64805651
......@@ -18,5 +18,5 @@ from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'news/', include('webapp.urls'))
url(r'^news/', include('webapp.urls'))
]
/*----------------------------------------------------------------------------------------------------
General styling
----------------------------------------------------------------------------------------------------*/
@-webkit-keyframes fstAnimationEnter {
from {
opacity: 0;
-webkit-transform: translate3d(0, -1em, 0); }
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0); } }
@-moz-keyframes fstAnimationEnter {
from {
opacity: 0;
-moz-transform: translate3d(0, -1em, 0); }
to {
opacity: 1;
-moz-transform: translate3d(0, 0, 0); } }
@keyframes fstAnimationEnter {
from {
opacity: 0;
-webkit-transform: translate3d(0, -1em, 0);
-moz-transform: translate3d(0, -1em, 0);
-ms-transform: translate3d(0, -1em, 0);
-o-transform: translate3d(0, -1em, 0);
transform: translate3d(0, -1em, 0); }
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0); } }
.fstElement {
position: relative;
border: 1px solid #D7D7D7;
border-radius: 5px;
box-sizing: border-box;
color: #232323;
background-color: #fff; }
.fstElement > select,
.fstElement > input {
position: absolute;
left: -999em; }
.fstToggleBtn {
display: block;
position: relative;
box-sizing: border-box;
padding: .5rem .75rem;
min-width: 14.28571em;
cursor: pointer; }
.fstToggleBtn:after {
position: absolute;
content: "";
right: 0.71429em;
top: 50%;
margin-top: -0.17857em;
border: 0.35714em solid transparent;
border-top-color: #cacaca; }
.fstQueryInput {
-webkit-appearance: none;
-moz-appearance: none;
-ms-appearance: none;
-o-appearance: none;
appearance: none;
outline: none;
box-sizing: border-box;
background: transparent;
border: 0; }
.fstResults {
position: absolute;
left: -1px;
top: 100%;
right: -1px;
max-height: 30em;
overflow-x: hidden;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
border: 1px solid #D7D7D7;
border-top: 0;
background-color: #FFF;
display: none; }
.fstResultItem {
display: block;
padding: 0.5em 0.71429em;
margin: 0;
cursor: pointer;
border-top: 1px solid #fff; }
.fstResultItem.fstUserOption {
color: #707070; }
.fstResultItem.fstFocused {
color: #fff;
background-color: #43A2F3;
border-color: #73baf6; }
.fstResultItem.fstSelected {
color: #fff;
background-color: #2694f1;
border-color: #73baf6; }
.fstGroupTitle {
display: block;
padding: 0.5em 0.71429em;
margin: 0;
font-weight: bold; }
.fstGroup {
padding-top: 1em; }
.fstGroup:first-child {
padding-top: 0; }
.fstNoResults {
display: block;
padding: 0.71429em 0.71429em;
margin: 0;
color: #999; }
/*----------------------------------------------------------------------------------------------------
Single Mode
----------------------------------------------------------------------------------------------------*/
.fstSingleMode .fstControls {
position: absolute;
left: -1px;
right: -1px;
top: 100%;
padding: 0.5em;
border: 1px solid #D7D7D7;
background-color: #fff;
display: none; }
.fstSingleMode .fstQueryInput {
display: block;
width: 100%;
padding: 0.5em 0.35714em;
color: #999;
border: 1px solid #D7D7D7; }
.fstSingleMode.fstActive {
z-index: 100; }
.fstSingleMode.fstActive.fstElement,
.fstSingleMode.fstActive .fstControls,
.fstSingleMode.fstActive .fstResults {
box-shadow: 0 0.2em 0.2em rgba(0, 0, 0, 0.1); }
.fstSingleMode.fstActive .fstControls {
display: block; }
.fstSingleMode.fstActive .fstResults {
display: block;
z-index: 10;
margin-top: -1px; }
/*----------------------------------------------------------------------------------------------------
Multiple mode
----------------------------------------------------------------------------------------------------*/
.fstChoiceItem {
display: inline-block;
position: relative;
margin: 0 0.41667em 0.41667em 0;
padding: 0em 0.33333em 0em 1.5em;
float: left;
border-radius: 0.25em;
border: 1px solid #43A2F3;
cursor: auto;
color: #fff;
background-color: #43A2F3;
-webkit-animation: fstAnimationEnter 0.2s;
-moz-animation: fstAnimationEnter 0.2s;
animation: fstAnimationEnter 0.2s; }
.fstChoiceItem.mod1 {
background-color: #F9F9F9;
border: 1px solid #D7D7D7;
color: #232323; }
.fstChoiceItem.mod1 > .fstChoiceRemove {
color: #a4a4a4; }
.fstChoiceRemove {
margin: 0;
padding: 0;
border: 0;
cursor: pointer;
background: none;
position: absolute;
left: 0;
top: 50%;
width: 1.28571em;
line-height: 1.28571em;
margin-top: -0.64286em;
text-align: center;
color: #fff; }
.fstChoiceRemove::-moz-focus-inner {
padding: 0;
border: 0; }
.fstMultipleMode .fstControls {
box-sizing: border-box;
padding: .5rem .75rem 0rem;
overflow: hidden;
cursor: text; }
.fstMultipleMode .fstQueryInput {
float: left;
margin: 0 0 0.45em 0;
width: 2em;
color: #999; }
.fstMultipleMode .fstQueryInputExpanded {
float: none;
width: 100%;
}
.fstMultipleMode.fstActive,
.fstMultipleMode.fstActive .fstResults {
box-shadow: 0 0.2em 0.2em rgba(0, 0, 0, 0.1); }
.fstMultipleMode.fstActive .fstResults {
display: block;
z-index: 10;
border-top: 1px solid #D7D7D7; }
/* Actions */
.actions {
display: flex;
}
.actions-form {
display: flex;
margin-left: 35px;
}
.actions-form > * {
margin: 0 5px;
}
.actions-select {
width: 150px;
}
/* Action block */
.divider {
opacity: 0.2;
}
.action-block {
padding-left: 17px;
}
.action-block-delete {
color: #d9534f;
}
.action-block-view {
color: #5bc0de;
}
.action-block-edit {
color: #0275d8;
}
.action-block-delete:hover {
color: #c9302c;
}
.action-block-view:hover {
color: #31b0d5;
}
.action-block-edit:hover {
color: #025aa5;
}
This diff is collapsed.
// Table page
$(document).ready(function() {
// ------------------------------
// Settings
// ------------------------------
// var AJAX_URL = 'https://localhost:3002';
var selectAllChk = '#select-all';
var chk = '.checkbox';
var counter = '.actions-delete-counter';
var deleteBtn = '.js-delete-items';
// Action block
var actionView = '.action-block-view';
var actionEdit = '.action-block-edit';
var actionDelete = '.action-block-delete';
function actionData(element) {
var id = parseInt($(element).closest('tr').find('.checkbox').prop('id'));
var type = $(element).data().type;
var elementDetails = {
id: id,
type: type
};
return elementDetails;
}
function updateCounter() {
var count = 0;
var presentSelected = $('.checkbox:checked').length > 0 ? false : true;
var selectedLength = $('.checkbox').each(function(index, item) {
$(item).prop('checked') === true
? count++
: ''
});
$(counter).text(count);
$(deleteBtn).prop('disabled', presentSelected);
}
function deleteData() {
var items = {
id: [],
type: 'deleteAll'
};
var selectedLength = $('.checkbox').each(function(index, item) {
$(item).prop('checked') === true
? items.id.push($(item).prop('id'))
: ''
});
return items;
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
function ajaxPost(url, data) {
$.ajax({
headers: { 'X-CSRFToken': getCookie('csrftoken') },
type: "POST", //rest Type
dataType: 'json', //mispelled
data: JSON.stringify(data),
url: url,
async: false,
contentType: "application/json; charset=utf-8",
success: function (msg) {
console.log(msg);
location.reload();
}
})
}
updateCounter();
$(selectAllChk).click(function () {
$(chk).prop('checked', $(this).prop('checked'));
updateCounter();
});
$(chk).on('click', updateCounter);
$(deleteBtn).on('click', function() {
var data = deleteData();
ajaxPost('/news/', data);
});
$(actionView).on('click', function(e) {
e.preventDefault();
var data = actionData(this);
ajaxPost('/news/', data);
});
$(actionEdit).on('click', function(e) {
e.preventDefault();
var data = actionData(this);
ajaxPost('/news/', data);
});
$(actionDelete).on('click', function(e) {
e.preventDefault();
var data = actionData(this);
ajaxPost('/news/', data);
});
});
// Index Page
$(document).ready(function() {
$('.multiselect').fastselect();
$('#publish-date').datepicker();
});
\ No newline at end of file
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.6.4/css/bootstrap-datepicker3.min.css">
{% block head %}
<title>Title</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css"
integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'css/style.css' %}">
{% block style %}
{% endblock %}
{% block title %}
<title>Document</title>
{% endblock %}
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.6.4/js/bootstrap-datepicker.min.js"></script>
{% block content %}
{% endblock %}
{% block content %}
{% endblock %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
<script src="{% static 'js/script.js' %}"></script>
{% block script %}
{% endblock %}
</body>
</html>
\ No newline at end of file
{% extends "base.html" %}
{% block content %}
<form class="form" action="{% url 'accept' %}" method="post">
{% csrf_token %}
<nav class="navbar navbar-toggleable-md navbar-light bg-faded">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo01"
aria-controls="navbarTogglerDemo01" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarTogglerDemo01">
<div class="actions mr-auto">
<button class="js-delete-items btn btn-danger">
<span>Delete items (</span><span class="actions-delete-counter">0</span><span>)</span>
</button>
<form class="actions-form">
<select class="form-control actions-select">
<option>Default</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
<select class="form-control actions-select">
<option>Default</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
<button type="submit" class="btn btn-success">Filter</button>
</form>
</div>
<a href="/" class="btn btn-primary">Add News</a>
</div>
</nav>
<form class="form">
<table class="table table-hover">
<thead class="thead-inverse">
<tr>
<th>#</th>
<th>Title</th>
<th>
<span><input id="select-all" type="checkbox"></span>
<span><label for="select-all">Select all</label></span>
<span>Title</span>
</th>
<th>Media</th>
<th>Type</th>
<th>Region</th>
<th>Publish date</th>
</tr>
</thead>
<tbody>
{% for i in news %}
<tr>
<th scope="row">{{ forloop.counter }}</th>
<td><a href="{% url 'single_news' i.id %}">{{ i.title }}</a></td>
<td><input class="checkbox" type="checkbox" name="item" value="{{ i.id }}"></td>
</tr>
<td>
<span><input id="{{ i.id }}" class="checkbox" type="checkbox"></span>
<span><a href="{% url 'single_news' i.id %}">{{ i.title }}</a></span>
<div class="action-block">
<a href="#" data-type="view" class="action-block-view"><strong>View</strong></a>
<span class="divider">|</span>
<a href="{% url 'single_news' i.id %}" data-type="edit" class="action-block-edit"><strong>Edit</strong></a>
<span class="divider">|</span>
<a href="#" data-type="delete" class="action-block-delete"><strong>Delete</strong></a>
</div>
</td>
<td>{{ i.get_media }}</td>
<td>{{ i.get_type }}</td>
<td>{{ i.get_region }}</td>
<td>{{ i.publish_date }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="container">
<div class="row">
<div class="offset-9 col-3">
<button type="submit" class="btn btn-primary">Write to DB</button>
</div>
</div>
</div>
</form>
<script>
$("#select-all").click(function () {
$(".checkbox").prop('checked', $(this).prop('checked'));
});
</script>
{% endblock %}
\ No newline at end of file
This diff is collapsed.
{% extends "base.html" %}
{% block content %}
<div class="container mt-5">
<h1>Bla-bla-bla. La-la-la. Blu-lu-lu. A-a-a. Opa-cha-opa-cha.</h1>
<a href="#" class="btn btn-primary mt-3">Edit</a>
<div class="new-content mt-5">
<div class="new-content-field mb-4">
<h5 class="new-content-title">- NY</h5>
</div>
<div class="new-content-field mb-4">
<h5 class="new-content-title">EntityURL</h5>
<div class="new-content-description">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestias
quia aliquid praesentium ratione at eos ut earum quam, distinctio hic voluptatum tempora porro eligendi,
blanditiis illum modi debitis, eum culpa.
</div>
</div>
<div class="new-content-field mb-4">
<h5 class="new-content-title">Media</h5>
<div class="new-content-description">
<div>TechCrunch</div>
<a href="#">http://techcrunch.com</a>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
from django.contrib import admin
# Register your models here.
from .models import News, WpEsiEntity
admin.site.register(News)
admin.site.register(WpEsiEntity)
from django.db import models
from .wp import WpEsiMedia, WpEsiEntity, WpEsiType, WpEsiRegion
class News(models.Model):
......@@ -20,3 +21,12 @@ class News(models.Model):
def __str__(self):
return self.title
def get_media(self):
return WpEsiMedia.objects.get(id=self.media_id)
def get_type(self):
return WpEsiType.objects.get(id=self.type_id)
def get_region(self):
return WpEsiRegion.objects.get(id=self.region_id)
......@@ -207,6 +207,9 @@ class WpEsiMedia(models.Model):
managed = False
db_table = 'wp_esi_media'
def __str__(self):
return self.name
class WpEsiNews(models.Model):
title = models.CharField(max_length=255)
......@@ -350,6 +353,9 @@ class WpEsiRegion(models.Model):
managed = False
db_table = 'wp_esi_region'
def __str__(self):
return self.name
class WpEsiSolution(models.Model):
entity_id = models.IntegerField()
......@@ -430,6 +436,9 @@ class WpEsiType(models.Model):
managed = False
db_table = 'wp_esi_type'
def __str__(self):
return self.name
class WpIclContentStatus(models.Model):
rid = models.BigIntegerField()
......
from django.shortcuts import render, HttpResponseRedirect, reverse
import json
from django.shortcuts import render, redirect, reverse, HttpResponseRedirect, HttpResponse
from django.views.generic import ListView, DetailView, CreateView
from .models import News, WpEsiNews, WpEsiNewsEntity, WpEsiMedia
from .models import News, WpEsiNews, WpEsiNewsEntity, WpEsiMedia, WpEsiEntity
class ListNewsView(ListView):
template_name = 'list_news.html'
def get(self, request, *args, **kwargs):
news = News.objects.filter(is_accepted=False).order_by('id')
news = News.objects.filter(is_accepted=False).order_by('record_date').order_by('id')
return render(request, self.template_name, {'news': news})
def post(self, request, *args, **kwargs):
if request.is_ajax():
data = json.loads(request.body.decode('utf-8'))
print(data)
type_request = data['type']
ids = data['id']
if type_request in ['delete', 'deleteAll']:
self._delete(ids)
if type_request == 'edit':
return HttpResponse('/news/1')
return HttpResponse(reverse('list_news'))
def _delete(self, id):
if isinstance(id, list):
News.objects.filter(id__in=id).update(is_accepted=True)
else:
News.objects.filter(id=id).update(is_accepted=True)
class DetailNewsView(DetailView):
template_name = 'single_news.html'
......@@ -18,8 +38,10 @@ class DetailNewsView(DetailView):
def get(self, request, *args, **kwargs):
news = News.objects.get(id=kwargs.get('id'))
media = WpEsiMedia.objects.all()
default_media = WpEsiMedia.objects.get(id=news.media_id)
return render(request, self.template_name, {'news': news, 'media': [default_media, media]})
company = WpEsiEntity.objects.get(id=news.company_id)
return render(request, self.template_name, {'news': news,
'media': media,
'company': company})
class AcceptNewsView(CreateView):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment