parent
c7ba533f5f
commit
a89c5b3d27
20 changed files with 909 additions and 112 deletions
@ -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, |
||||||
|
), |
||||||
|
] |
||||||
@ -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,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>$</option> |
||||||
|
<option>$</option> |
||||||
|
<option>$</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…
Reference in new issue