#ARC-17 Add middleware

remotes/origin/setup
Mukhtar 10 years ago
parent 786c20e574
commit f0c532c2ff
  1. 3
      api/views.py
  2. 1
      archilance/settings/base.py
  3. 142
      chat/templates/chat_contractor.html
  4. 4
      chat/templates/chat_customer.html
  5. 3
      common/admin.py
  6. 11
      common/middleware.py
  7. 25
      common/migrations/0004_settings.py
  8. 11
      common/models.py
  9. 2
      templates/partials/base.html
  10. 242
      users/templates/contractor_profile.html
  11. 18
      users/templates/worksell_create_form.html
  12. 35
      work_sell/templates/picture_basic_form.html
  13. 13
      work_sell/templates/upload.html

@ -37,9 +37,12 @@ class MessageViewSet(ModelViewSet):
def get_queryset(self):
queryset = Message.objects.all()
search_param = self.request.query_params.get('operand', None)
recipent_id = self.request.query_params.get('recipent_id', None)
sender_id = self.request.query_params.get('sender_id', None)
# queryset = queryset.filter(Q(sender=self.request.user.pk) | Q(recipent=self.request.user.pk))
# import code; code.interact(local=dict(globals(), **locals()))
if search_param:
# import code; code.interact(local=dict(globals(), **locals()))
queryset = queryset.filter(Q(sender=self.request.user.pk) | Q(recipent=self.request.user.pk))
return queryset

@ -64,6 +64,7 @@ MIDDLEWARE_CLASSES = [
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'common.middleware.SetLastVisitMiddleware',
]
ROOT_URLCONF = 'archilance.urls'

@ -34,7 +34,7 @@
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
{% for contact in contractor_contacts %}
<div class="message messd user-block" data-id="{{ contact.recipent_id}}">
<div class="message messd user-block" data-id="{% if request.user.pk == contact.recipent_id %}{{ contact.sender_id }} {% else %}{{ contact.recipent_id}}{% endif %}">
<div class="imgMess">
<img src="{% static 'img/mess.png' %}" alt="mess-image">
</div>
@ -42,7 +42,11 @@
<a href="#">{{ contact.recipent_id__first_name }} {{ contact.recipent_id__last_name }}</a>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
<span>0</span>
<a>Recipent_id {{ contact.recipent_id }}</a>
<a>Sender_id {{ contact.sender_id }}</a>
<a>Current {{ request.user.pk }}</a>
<a href="javascript:void(0)" class="deleteMess">
Удалить контакт
</a>
@ -340,5 +344,139 @@
{% endblock %}
{% block js_block %}
<script type="text/javascript" src="{% static 'js/chat.js' %}"></script>
{# <script type="text/javascript" src="{% static 'js/chat.js' %}"></script>#}
<script type="text/javascript">
/**
* Created by mukhtar on 04.07.16.
*/
var SocketHandler = function () {
var userId = {{ request.user.pk }};
var url = 'ws://127.0.0.1:8888/chat/' + userId +'/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150000);
};
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
this.send_contact_message = function (userId) {
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function (form) {
var elements = form.elements;
var data = {};
var i = 0;
for (var i; i < elements.length; i++) {
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
$(function () {
var socket = new SocketHandler();
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
// Вытащить сообщения для чата заказа
$('.order-block').on('click', function () {
var orderId = $(this).attr('data-id');
$("#chat-contractor-order #orderId").val(orderId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'recipent__id': userId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
console.log(v.sender.id);
console.log(v.recipent.id);
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
});
// Добавить сообщение для контакта
$('#contact-chat-add-message').on('click', function () {
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val();
socket.add_contact_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
}
});
$("#chat").val("");
});
});
</script>
{% endblock %}

@ -256,8 +256,10 @@
});
});
var userId = '{{ request.user.pk }}';
var SocketHandler = function(){
var url = 'ws://127.0.0.1:8888/chat';
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function(){

@ -1,10 +1,11 @@
from django.contrib import admin
from mptt.admin import MPTTModelAdmin
from .models import Location, MainPage
from .models import Location, MainPage, Settings
class LocationAdmin(MPTTModelAdmin):
readonly_fields = ('pk', 'lft', 'rght', 'tree_id', 'level')
admin.site.register(Location, LocationAdmin)
admin.site.register(MainPage)
admin.site.register(Settings)

@ -0,0 +1,11 @@
from django.utils.timezone import now
from users.models import User
class SetLastVisitMiddleware(object):
def process_response(self, request, response):
if request.user.is_authenticated():
User.objects.filter(pk=request.user.pk).update(last_time_visit=now())
return response

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-13 09:17
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('common', '0003_mainpage'),
]
operations = [
migrations.CreateModel(
name='Settings',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time_notification', models.IntegerField(default=180)),
],
options={
'verbose_name': 'Настройки сайта',
},
),
]

@ -32,3 +32,14 @@ class MainPage(models.Model):
class Meta:
verbose_name = 'Главная страница'
class Settings(models.Model):
time_notification = models.IntegerField(default=180)
def __str__(self):
return 'Настройки сайта'
class Meta:
verbose_name = 'Настройки сайта'
verbose_name_plural = 'Настройки сайта'

@ -47,8 +47,10 @@
<script src='{% static "lib/urijs/URI.min.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/vendor/jquery.ui.widget.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.iframe-transport.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>
<script src='{% static "my-libs.js" %}'></script>

@ -123,12 +123,12 @@
</div>
<div id="portfolio-modal" class="modal fade">
<div class="modal-dialog">
<div class="modal-dialog" style="width:900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×
</button>
<h4 class="modal-title" >Добавить портфолио</h4>
<h4 class="modal-title">Добавить портфолио</h4>
</div>
{% include 'portfolio_create_form.html' %}
</div>
@ -149,9 +149,9 @@
<p>{{ p.name }}</p>
<div class="buttonsImg" disTab>
<a href="{% url 'projects:contractor-portfolio-edit' p.pk %}">
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
</a>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
@ -177,7 +177,7 @@
</p>
</div>
<div id="worksell-modal" class="modal fade">
<div class="modal-dialog">
<div class="modal-dialog" style="width: 900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×
@ -249,10 +249,11 @@
<div class="top-summary">
<p class="name-summ">{{ user.get_full_name }}</p>
{% if contractor.contractor_resume.resume_file.url %}
<a href="{{ contractor.contractor_resume.resume_file.url }}" class="download-summ">скачать резюме</a>
<a href="{{ contractor.contractor_resume.resume_file.url }}"
class="download-summ">скачать резюме</a>
{% endif %}
<p class="who-summ">
{# Мужчина, 24 года, {{ user.date_of_birth }}#}
{# Мужчина, 24 года, {{ user.date_of_birth }}#}
</p>
<div class="list-summ-block">
<div class="col-lg-4">
@ -294,27 +295,28 @@
</div>
<div class="galleryWork2 gal-iss disTab">
{% for diplom in resume_diploms %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail diplom.img "210x334" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
{% for diplom in resume_diploms %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail diplom.img "210x334" crop="center" as im %}
<div class="imgGal"
style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
{{ diplom.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
<div class="insetCol2 box-sizing disTab">
<p>
{{ diplom.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
</div>
@ -327,27 +329,28 @@
</div>
<div class="galleryWork2 gal-iss disTab">
{% for cro in resume_cro %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail cro.img "210x334" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
{% for cro in resume_cro %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail cro.img "210x334" crop="center" as im %}
<div class="imgGal"
style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
<div class="insetCol2 box-sizing disTab">
<p>
{{ cro.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
</div>
@ -394,66 +397,101 @@
{% block js_block %}
<script type="text/javascript">
var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150000);
};
sock.onmessage = function (event) {
var notificationData =JSON.parse(event.data);
$.jGrowl("Вам пришло новое сообщение!" + notificationData.msg, { sticky: true });
};
}
$(function(){
var socket = new SocketHandler();
$('#worksell-add-form').on('submit', function(e){
e.preventDefault();
var dataSerializer = $(this).serialize();
$.ajax({
url: '/work_sell/test/',
method: 'POST',
data: dataSerializer,
dataType: 'json',
success: function(data){
if (data.status == 'ok') {
location.reload();
}
},
error: function(jqXHR, exception){
console.log(jqXHR.statusCode);
}
})
});
$('#portfolio-add-form').on('submit', function(e) {
e.preventDefault();
var dataSerializer = $(this).serialize();
$.ajax({
url: '/projects/portfolio/create/',
method: 'POST',
data: dataSerializer,
dataType: 'json',
success: function (data) {
if (data.status == 'ok') {
location.reload();
}
},
error: function (jqXHR, exception) {
console.log(jqXHR.statusCode);
}
});
});
});
var userId = '{{ contractor.pk }}';
var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150000);
};
sock.onmessage = function (event) {
var notificationData = JSON.parse(event.data);
$.jGrowl("Вам пришло новое сообщение!" + notificationData.msg, {sticky: true});
};
}
$(function () {
var socket = new SocketHandler();
$('#worksell-add-form').on('submit', function (e) {
e.preventDefault();
var dataSerializer = $(this).serialize();
$.ajax({
url: '/work_sell/test/',
method: 'POST',
data: dataSerializer,
dataType: 'json',
success: function (data) {
if (data.status == 'ok') {
location.reload();
}
},
error: function (jqXHR, exception) {
console.log(jqXHR.statusCode);
}
})
});
$('#portfolio-add-form').on('submit', function (e) {
e.preventDefault();
var dataSerializer = $(this).serialize();
$.ajax({
url: '/projects/portfolio/create/',
method: 'POST',
data: dataSerializer,
dataType: 'json',
success: function (data) {
if (data.status == 'ok') {
location.reload();
}
},
error: function (jqXHR, exception) {
console.log(jqXHR.statusCode);
}
});
});
var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken');
$('#fileupload').fileupload({
url: url,
crossDomain: false,
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {
console.log(data);
$.each(data.result.files, function (index, file) {
var img = $('<img style="width:200px;height:200px;">').attr('src', file.url).appendTo("#files");
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
console.log(progress);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
</script>
{% endblock %}

@ -79,6 +79,24 @@
<input type="file" name="{{ worksell_form.img.html_name }}" >
</div>
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Выберите файлы</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" name="file" multiple>
</span>
<br>
<br>
<!-- The global progress bar -->
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<!-- The container for the uploaded files -->
<div id="files" class="files"></div>
<br>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить проект">
</div>

@ -15,42 +15,16 @@
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="https://github.com/sigurdga/django-jquery-file-upload">Django jQuery File Upload</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Demo</a></li>
</ul>
</div>
</div>
</div>
<div class="container">
<h1>Django jQuery File Upload Demo</h1>
<h2 class="lead">Basic version</h2>
<h1>Загрузка файлов</h1>
<ul class="nav nav-tabs">
<li class="active"><a href="/upload/basic">Basic</a></li>
<li><a href="/upload/basic/plus">Basic Plus</a></li>
<li><a href="/upload/new">Basic Plus UI</a></li>
<li><a href="/upload/angular">AngularJS</a></li>
<li><a href="/upload/jquery-ui">jQuery UI</a></li>
</ul>
<br>
<blockquote>
<p>File Upload widget</p>
</blockquote>
<br>
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Select files...</span>
<span>Выберите файлы</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" name="file" multiple>
</span>
@ -99,11 +73,12 @@ $(function () {
done: function (e, data) {
console.log(data);
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo('#files');
var img = $('<img style="width:200px;height:200px;">').attr('src', file.url).appendTo(document.body);
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
console.log(progress);
$('#progress .progress-bar').css(
'width',
progress + '%'

@ -2,7 +2,7 @@
{% block content %}
<h1>Upload Files</h1>
<h1>Hello</h1>
<form id="fileupload" method="POST" enctype="multipart/form-data">
@ -39,7 +39,18 @@ $(function () {
done: function (e, data) {
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo(document.body);
$('<p/>').text().appendTo(document.body);
var img = $('<img>').attr('src', file.url).appendTo(document.body);
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
console.log(progress);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
});
});

Loading…
Cancel
Save