#ARC-8 Add models, views and templates, sorl-thumbnails

remotes/origin/setup
Mukhtar 10 years ago
parent c7ba533f5f
commit a89c5b3d27
  1. 1
      archilance/settings/base.py
  2. 1
      archilance/urls.py
  3. 143
      assets/js/chat.js
  4. 9
      chat/admin.py
  5. 26
      chat/migrations/0005_notes.py
  6. 46
      chat/migrations/0006_auto_20160704_1811.py
  7. 9
      chat/models.py
  8. 1
      chat/serializers.py
  9. 107
      chat/templates/chat_contractor.html
  10. 22
      projects/migrations/0037_auto_20160704_1444.py
  11. 15
      projects/serializers.py
  12. 14
      users/filters.py
  13. 3
      work_sell/admin.py
  14. 21
      work_sell/migrations/0005_auto_20160704_1449.py
  15. 29
      work_sell/migrations/0006_worksellphoto.py
  16. 19
      work_sell/models.py
  17. 219
      work_sell/templates/worksell_detail.html
  18. 310
      work_sell/templates/worksells_list.html
  19. 13
      work_sell/urls.py
  20. 13
      work_sell/views.py

@ -34,6 +34,7 @@ THIRD_PARTY_APPS = [
'mptt', 'mptt',
'registration', 'registration',
'rest_framework', 'rest_framework',
'sorl.thumbnail',
] ]
LOCAL_APPS = [ LOCAL_APPS = [

@ -10,6 +10,7 @@ from .views import HomeTemplateView, TestChatTemplateView
urlpatterns = [ urlpatterns = [
url(r'^$', HomeTemplateView.as_view()), url(r'^$', HomeTemplateView.as_view()),
url(r'^chattest$', TestChatTemplateView.as_view()), url(r'^chattest$', TestChatTemplateView.as_view()),
url(r'^work_sell/', include('work_sell.urls')),
url(r'^test/$', TemplateView.as_view(template_name='test.html'), name='test'), url(r'^test/$', TemplateView.as_view(template_name='test.html'), name='test'),
url(r'^projects/', include('projects.urls')), url(r'^projects/', include('projects.urls')),
url(r'^chat/', include('chat.urls')), url(r'^chat/', include('chat.urls')),

@ -0,0 +1,143 @@
/**
* Created by mukhtar on 04.07.16.
*/
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
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) {
console.log(event.data);
alert(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) {
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("");
});
});

@ -1,7 +1,14 @@
from django.contrib import admin from django.contrib import admin
from .models import Message from .models import Message, Notes
class MessageAdmin(admin.ModelAdmin): class MessageAdmin(admin.ModelAdmin):
list_display = ('text', 'sender', 'recipent',) list_display = ('text', 'sender', 'recipent',)
class NotesAdmin(admin.ModelAdmin):
list_display = ('text', 'sender', 'recipent', 'order',)
admin.site.register(Message, MessageAdmin) admin.site.register(Message, MessageAdmin)
admin.site.register(Notes, NotesAdmin)

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-07-04 11:44
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chat', '0004_auto_20160630_1204'),
]
operations = [
migrations.CreateModel(
name='Notes',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField()),
],
options={
'verbose_name_plural': 'Сообщения',
'verbose_name': 'Сообщение',
},
),
]

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-07-04 15:11
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('projects', '0037_auto_20160704_1444'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('chat', '0005_notes'),
]
operations = [
migrations.AlterModelOptions(
name='notes',
options={'verbose_name': 'Заметка', 'verbose_name_plural': 'Заметки'},
),
migrations.AddField(
model_name='notes',
name='created',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AddField(
model_name='notes',
name='order',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_notes', to='projects.Order'),
),
migrations.AddField(
model_name='notes',
name='recipent',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='recipent_notes', to=settings.AUTH_USER_MODEL),
preserve_default=False,
),
migrations.AddField(
model_name='notes',
name='sender',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='sender_notes', to=settings.AUTH_USER_MODEL),
preserve_default=False,
),
]

@ -22,11 +22,14 @@ class Message(models.Model):
class Notes(models.Model): class Notes(models.Model):
text = models.TextField() text = models.TextField()
created = models.DateTimeField(default=timezone.now)
sender = models.ForeignKey(User, related_name='sender_notes')
recipent = models.ForeignKey(User, related_name='recipent_notes')
order = models.ForeignKey(Order, related_name='order_notes', null=True, blank=True)
def __str__(self): def __str__(self):
return self.text return self.text
class Meta: class Meta:
verbose_name = 'Сообщение' verbose_name = 'Заметка'
verbose_name_plural = 'Сообщения' verbose_name_plural = 'Заметки'

@ -13,6 +13,7 @@ class MessageSerializer(ModelSerializer):
fields = ( fields = (
'text', 'text',
'created', 'created',
'order',
'sender', 'sender',
'recipent', 'recipent',
'private_type', 'private_type',

@ -124,16 +124,7 @@
<span>7мб</span> <span>7мб</span>
<div></div> <div></div>
</li> </li>
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul> </ul>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
Распечатать с помощью ресурса Распечатать с помощью ресурса
@ -185,6 +176,7 @@
</div> </div>
<div class="col-lg-6 commChat"> <div class="col-lg-6 commChat">
<div id="message-chat-order-space">
{% for msg in chat_messages %} {% for msg in chat_messages %}
<div class="col-lg-12 insetCommChat {% if msg.sender.pk == request.user.pk %}youChat{% endif %}"> <div class="col-lg-12 insetCommChat {% if msg.sender.pk == request.user.pk %}youChat{% endif %}">
<div class="topCommChat"> <div class="topCommChat">
@ -194,6 +186,12 @@
<p class="textCommChat">{{ msg }}</p> <p class="textCommChat">{{ msg }}</p>
</div> </div>
{% endfor %} {% endfor %}
</div>
<form id="chat-contractor-order">
<input type="text" id="orderId" />
<input type="text" id="senderOrderId" value="{{ request.user.pk }}" />
<input type="text" id="recipentOrderId" />
<textarea id="chat" class="box-sizing"></textarea> <textarea id="chat" class="box-sizing"></textarea>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing"> <div class="setChat box-sizing">
@ -204,6 +202,7 @@
</div> </div>
<a href="javascript:void(0)">отправить</a> <a href="javascript:void(0)">отправить</a>
</div> </div>
</form>
</div> </div>
<div class="col-lg-3 wrTAB"> <div class="col-lg-3 wrTAB">
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
@ -361,91 +360,5 @@
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript" src="{% static 'js/chat.js' %}"></script>
<script type="text/javascript">
$(function(){
var socket = new SocketHandler();
var form = document.getElementById('message_form');
$('.order-block').on('click',function(){
var orderId = $(this).attr('data-id');
});
$('.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 = '';
socket.send_contact_message(userId);
});
$('#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("");
});
});
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){
console.log(event.data);
alert(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 = "";
}
}
</script>
{% endblock %} {% endblock %}

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-07-04 11:44
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('projects', '0036_auto_20160630_1846'),
]
operations = [
migrations.AlterField(
model_name='order',
name='contractor',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL),
),
]

@ -1,6 +1,6 @@
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from .models import Project, Realty, BuildingClassfication, ConstructionType from .models import Project, Realty, BuildingClassfication, ConstructionType, Order
from common.serializers import LocationSerializer from common.serializers import LocationSerializer
from specializations.serializers import SpecializationSerializer from specializations.serializers import SpecializationSerializer
from users.serializers import UserSerializer from users.serializers import UserSerializer
@ -45,6 +45,19 @@ class RealtySerializer(ModelSerializer):
) )
class OrderSerializer(ModelSerializer):
class Meta:
model = Order
fields = (
'contractor',
'created',
'project',
'secure',
'status',
)
class ProjectSerializer(ModelSerializer): class ProjectSerializer(ModelSerializer):
customer = UserSerializer() customer = UserSerializer()
specialization = SpecializationSerializer() specialization = SpecializationSerializer()

@ -2,13 +2,13 @@ from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import User from .models import User
class UserFilterSet(FilterSet): class UserFilterSet(FilterSet):
# id = AllLookupsFilter() id = AllLookupsFilter()
# email = AllLookupsFilter() email = AllLookupsFilter()
# first_name = AllLookupsFilter() first_name = AllLookupsFilter()
# is_active = AllLookupsFilter() is_active = AllLookupsFilter()
# is_admin = AllLookupsFilter() is_admin = AllLookupsFilter()
# last_name = AllLookupsFilter() last_name = AllLookupsFilter()
# projects = RelatedFilter('projects.filters.ProjectFilterSet') projects = RelatedFilter('projects.filters.ProjectFilterSet')
class Meta: class Meta:
model = User model = User

@ -1,4 +1,5 @@
from django.contrib import admin from django.contrib import admin
from .models import WorkSell from .models import WorkSell, WorkSellPhoto
admin.site.register(WorkSell) admin.site.register(WorkSell)
admin.site.register(WorkSellPhoto)

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-07-04 11:49
from __future__ import unicode_literals
from django.db import migrations
import sorl.thumbnail.fields
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0004_worksell_price'),
]
operations = [
migrations.AlterField(
model_name='worksell',
name='img',
field=sorl.thumbnail.fields.ImageField(upload_to='worksell/worksell'),
),
]

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-07-04 15:54
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import sorl.thumbnail.fields
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0005_auto_20160704_1449'),
]
operations = [
migrations.CreateModel(
name='WorkSellPhoto',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('img', sorl.thumbnail.fields.ImageField(upload_to='worksell/worksell')),
('worksell', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='work_sell.WorkSell')),
],
options={
'verbose_name': 'Изображение Готовая работа',
'verbose_name_plural': 'Изображения Готовые работы',
},
),
]

@ -1,16 +1,33 @@
from django.db import models from django.db import models
from sorl.thumbnail import ImageField
from users.models import User from users.models import User
class WorkSell(models.Model): class WorkSell(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
description = models.TextField(blank=True) description = models.TextField(blank=True)
img = models.ImageField(upload_to='worksell/worksell') img = ImageField(upload_to='worksell/worksell')
price = models.DecimalField(max_digits=10, decimal_places=0, default=0) price = models.DecimalField(max_digits=10, decimal_places=0, default=0)
contractor = models.ForeignKey(User, related_name='work_sell') contractor = models.ForeignKey(User, related_name='work_sell')
def __str__(self): def __str__(self):
return self.name return self.name
def is_author_for_work(self):
pass
class Meta: class Meta:
verbose_name = 'Готовая работа' verbose_name = 'Готовая работа'
verbose_name_plural = 'Готовые работы' verbose_name_plural = 'Готовые работы'
class WorkSellPhoto(models.Model):
img = ImageField(upload_to='worksell/worksell')
worksell = models.ForeignKey(WorkSell, related_name='photos')
def __str__(self):
return self.worksell.name
class Meta:
verbose_name = 'Изображение Готовая работа'
verbose_name_plural = 'Изображения Готовые работы'

@ -0,0 +1,219 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load thumbnail %}
{% block content %}
<body>
<div class="wrTop disTab">
<div class="container-fluid topMain">
<div class="row">
<div class="col-lg-3">
<div class="logo" onClick="window.location='/'"></div>
</div>
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="javascript:void(0)">Биржа проектов</a>
<span></span>
</li>
<li class="icon_tm2">
<a href="javascript:void(0)">Поиск исполнителей</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="javascript:void(0)">Работы на продажу</a>
<span></span>
</li>
</ul>
</div>
<div class="col-lg-2">
<div class="imgProfile">
<img src="img/profile.jpg" alt="profile-image">
</div>
<div class="infoProfile disTab">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button>
<ul class="dropdown-menu menu-drop-new">
<li class="icon_mm1">
<a href="#">
Войти заказчиком
<span></span>
</a>
</li>
<li class="icon_mm2">
<a href="#">
Войти исполнителем
<span></span>
</a>
</li>
<li class="icon_mm3">
<a href="#">
Сообщения
<span></span>
</a>
</li>
<li class="icon_mm4">
<a href="#">
Счет
<span></span>
</a>
</li>
<li class="icon_mm5">
<a href="#">
Настройки
<span></span>
</a>
</li>
<li class="icon_mm6">
<a href="#">
FAQ
<span></span>
</a>
</li>
</ul>
</div>
</div>
<div class="rating">
<div class="ratingInset"></div>
<div class="iconRating"></div>
</div>
<p class="ratingPer">45%</p>
</div>
</div>
</div>
</div>
<div class="container mainScore">
<div class="row">
<div class="col-lg-12 allProjects">
<p class="titleScore">{{ object }}</p>
<div class="all all1">
<p>предыдущий</p>
</div>
<div class="all all2">
<p>следующий</p>
</div>
</div>
<div class="btnReadyBlock disTab">
<div class="triangle1"></div>
<div class="col-lg-3">
<p class="cenaReady">{{ object.price }} <i class="fa fa-rub"></i></p>
</div>
<div class="col-lg-3">
<a href="javascript:void(0)" class="linkReady LR1">
купить
</a>
</div>
<div class="col-lg-3">
<a href="javascript:void(0)" class="linkReady LR2">
Написать сообщение
</a>
</div>
<div class="col-lg-3">
<a href="javascript:void(0)" class="linkReady LR3">
посмотреть контакты
</a>
</div>
</div>
<div class="desReadyBlock">
<div class="col-lg-10 col-lg-offset-1">
<p class="titleReady">Описание:</p>
</div>
<div class="col-lg-10 col-lg-offset-1">
<p class="textReady">
{{ object.text }}
</p>
</div>
<div class="col-lg-12 sliderReady">
<div class="arroww prev3"></div>
<div class="arroww next3"></div>
<div class="swiper-container gallery-top">
<div class="swiper-wrapper">
<div class="swiper-slide" style="background-image:url('{% static object.img.url %}')"></div>
{% for photo in object.photos.all %}
<div class="swiper-slide" style="background-image:url('{% static photo.img.url %}')"></div>
{% endfor %}
</div>
</div>
<div class="swiper-container gallery-thumbs">
<div class="swiper-wrapper">
<div class="swiper-slide is-selected" style="background-image:url('{% static object.img.url %}')"></div>
{% for photo in object.photos.all %}
<div class="swiper-slide" style="background-image:url('{% static photo.img.url %}')"></div>
{% endfor %}
</div>
</div>
</div>
<div class="col-lg-12">
<div class="triangle2"></div>
<div class="arr arr1"></div>
<div class="arr arr2"></div>
</div>
</div>
<div class="col-lg-12 sibl">
<p>Похожие работы</p>
</div>
<div class="gallMini disTab">
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
</div>
</div>
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}
{% block js_block %}
<script src="{% static 'js/swiper.min.js' %}"></script>
<script>
var galleryTop = new Swiper('.gallery-top', {
nextButton: '.next3',
prevButton: '.prev3',
spaceBetween: 10,
});
var galleryTop = new Swiper('.gallery-top', {
nextButton: '.next3',
prevButton: '.prev3',
spaceBetween: 15,
onSlideChangeEnd: function(swiper){
var activeIndex = swiper.activeIndex;
$(galleryThumbs.slides).removeClass('is-selected');
$(galleryThumbs.slides).eq(activeIndex).addClass('is-selected');
galleryThumbs.slideTo(activeIndex,300, false);
}
});
var galleryThumbs = new Swiper('.gallery-thumbs', {
spaceBetween: 15,
freeMode: true,
centeredSlides: false,
slidesPerView: 6,
touchRatio: 0.2,
nextButton: '.arr2',
prevButton: '.arr1',
onClick: function (swiper, event){
var clicked = swiper.clickedIndex
swiper.activeIndex = clicked;
swiper.updateClasses()
$(swiper.slides).removeClass('is-selected');
$(swiper.clickedSlide).addClass('is-selected');
galleryTop.slideTo(clicked,300, false);
}
});
</script>
{% endblock %}

@ -0,0 +1,310 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load thumbnail %}
{% block content %}
<div class="wrTop disTab">
<div class="container-fluid topMain">
<div class="row">
<div class="col-lg-3">
<div class="logo" onClick="window.location='/'"></div>
</div>
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="javascript:void(0)">Биржа проектов</a>
<span></span>
</li>
<li class="icon_tm2">
<a href="javascript:void(0)">Поиск исполнителей</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="javascript:void(0)">Работы на продажу</a>
<span></span>
</li>
</ul>
</div>
<div class="col-lg-2">
<div class="imgProfile">
<img src="img/profile.jpg" alt="profile-image">
</div>
<div class="infoProfile disTab">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button>
<ul class="dropdown-menu menu-drop-new">
<li class="icon_mm1">
<a href="#">
Войти заказчиком
<span></span>
</a>
</li>
<li class="icon_mm2">
<a href="#">
Войти исполнителем
<span></span>
</a>
</li>
<li class="icon_mm3">
<a href="#">
Сообщения
<span></span>
</a>
</li>
<li class="icon_mm4">
<a href="#">
Счет
<span></span>
</a>
</li>
<li class="icon_mm5">
<a href="#">
Настройки
<span></span>
</a>
</li>
<li class="icon_mm6">
<a href="#">
FAQ
<span></span>
</a>
</li>
</ul>
</div>
</div>
<div class="rating">
<div class="ratingInset"></div>
<div class="iconRating"></div>
</div>
<p class="ratingPer">45%</p>
</div>
</div>
</div>
</div>
<div class="container mainScore">
<div class="row">
<div class="col-lg-12">
<p class="titleScore">Работы на продажу</p>
</div>
<div class="col-lg-12">
<div class="filter clearfix">
<div class="triangle1"></div>
<div class="titleF1 disTab">
<div class="col-lg-3">Тип работ:</div>
<div class="col-lg-3">Специализации:</div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-4">Тип работ:</div>
<div class="col-lg-8">Специализации:</div>
</div>
<div class="searchF1 polsF1 polsFF">
<div class="col-lg-4">
<input type="text" placeholder="От" class="box-sizing otInp">
<input type="text" placeholder="До" class="box-sizing otInp">
<select class="selectpicker2 valul">
<option>&#36;</option>
<option>&#36;</option>
<option>&#36;</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<a href="javascript:void(0)" class="findReal">
найти исполнителя
</a>
</div>
<div class="col-lg-2">
<a href="javascript:void(0)" class="clearSearch">
Очистить фильтр
</a>
</div>
</div>
<div class="resSearchF1">
<div class="col-lg-3">
<p class="titleResF1">Расширенный поиск</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
</div>
<div class="col-lg-9">
<div class="borderS1"></div>
</div>
</div>
<div class="slideRes disTab activeSlide">
<div class="titleF1 disTab">
<div class="col-lg-3">Тип работ:</div>
<div class="col-lg-3">Специализации:</div>
<div class="col-lg-3"></div>
<div class="col-lg-3">Специализации:</div>
</div>
<div class="polsF1 polsF2 disTab">
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="galleryWork disTab">
{% for work in object_list %}
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<a href="{% url 'work_sell:detail' work.pk %}">
{% thumbnail work.img "265x265" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</a>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.price }} <i class="fa fa-rub"></i>
</div>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>{{ work }}</p>
<div class="buttonsImg" disTab>
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
{% thumbnail work.img "265x265" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.price }} <i class="fa fa-rub"></i>
</div>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>{{ work }}</p>
<div class="buttonsImg" disTab>
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
{% thumbnail work.img "265x265" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.price }} <i class="fa fa-rub"></i>
</div>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>{{ work }}</p>
<div class="buttonsImg" disTab>
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
<nav>
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</a>
</li>
<li class="active"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>...</li>
<li><a href="#">17</a></li>
<li>
<a href="#" aria-label="Next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
</a>
</li>
</ul>
</nav>
</div>
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}

@ -0,0 +1,13 @@
from django.conf import urls
from .views import (
WorkSellsView,
WorkSellDetail,
)
app_name = 'work_sell'
urlpatterns = [
urls.url(r'^$', WorkSellsView.as_view(), name='list'),
urls.url(r'^(?P<pk>\d+)/$', WorkSellDetail.as_view(), name='detail'),
]

@ -1,3 +1,14 @@
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import ListView, DetailView
# Create your views here. from .models import WorkSell
class WorkSellsView(ListView):
model = WorkSell
template_name = 'worksells_list.html'
class WorkSellDetail(DetailView):
model = WorkSell
template_name = 'worksell_detail.html'

Loading…
Cancel
Save