added client side of specialist catalog

remotes/origin/1203
Ivan Kovalkovskyi 10 years ago
parent fa2d0a313a
commit b3d0eb8072
  1. 1
      proj/urls.py
  2. 2
      service/urls.py
  3. 1
      service/views.py
  4. 6
      specialist_catalog/admin_urls.py
  5. 3
      specialist_catalog/forms.py
  6. 13
      specialist_catalog/models.py
  7. 6
      specialist_catalog/urls.py
  8. 109
      specialist_catalog/views.py
  9. 6
      templates/admin/specialist/catalog_all.html
  10. 12
      templates/admin/specialist/catalog_new.html
  11. 326
      templates/client/specialist_catalog/catalog_detailed.html

@ -55,6 +55,7 @@ urlpatterns = patterns('',
url(r'^', include('company.urls')),
url(r'^', include('photoreport.urls')),
url(r'^', include('article.urls')),
url(r'^specialist/', include("specialist_catalog.urls")),
url(r'^country/', include('country.urls')),
url(r'^city/', include('city.urls')),
url(r'^organiser/', include('organiser.urls')),

@ -4,7 +4,7 @@ from views import ServiceView, CallBackListView, VisitListView, TranslationListV
ParticipationListView, RemoteListView,TicketsListView, Thanks
urlpatterns = patterns('',
url(r'service/thanks/$', Thanks.as_view()),
url(r'service/thanks/$', Thanks.as_view(), name = "service_thanks"),
url(r'service/com_rek/(?P<catalog>.*)/(?P<event_url>.*)/$', 'service.views.advertise'),
url(r'service/com_rek/$', 'service.views.advertise'),
url(r'service/(?P<url>.*)/$', ServiceView.as_view()),

@ -46,7 +46,6 @@ class ServiceView(MetadataMixin, FormView):
def form_valid(self, form):
order = form.save(commit=False)
order.save()
#messages.success(self.request, _(u'Ваш запрос был успешно отправлен'))
return HttpResponseRedirect(self.success_url)
def get_context_data(self, **kwargs):

@ -9,10 +9,12 @@ urlpatterns = patterns('',
url(r'^specialist/delete/(?P<pk>\d{1,4})/$', SpecialistDeleteView.as_view(), name='specialist_delete'),
url(r'^catalog/new/$', CatalogCreateView.as_view(), name='catalog_new'),
url(r'^catalog/all/$', CatalogListView.as_view(), name='catalog_all'),
url(r'^catalog/city/$', CatalogCityView.as_view(), name='catalog_city'),
url(r'^catalog/country/$', CatalogCountryView.as_view(), name='catalog_country'),
url(r'^catalog/edit/(?P<pk>\d{1,4})/$', CatalogUpdateView.as_view(), name='catalog_edit'),
url(r'^catalog/delete/(?P<pk>\d{1,4})/$', CatalogDeleteView.as_view(), name='catalog_delete'),
url(r'^catalog/(?P<pk>\d{1,4})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'),
url(r'^catalog/(?P<catalog_pk>\d{1,4})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'),
#url(r'^catalog/(?P<pk>\d{1,4})/feedbacks/$', FeedbackListView.as_view(), name='feedback_all'),
url(r'^catalog/(?P<pk>\d{1,4})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'),
url(r'^catalog/(?P<catalog_pk>\d{1,4})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'),
url(r'^feedback/delete/(?P<pk>\d{1,4})/$', FeedbackDeleteView.as_view(), name='feedback_delete'),
)

@ -23,13 +23,14 @@ class SpecialistCatalogForm(TranslatableModelForm):
class Meta:
model = SpecialistCatalog
fields = ['price', 'currency', 'logo_preview', 'main_descr', 'place_photo',
'specialists', 'city', 'country', 'type', 'title', 'benefits']
'specialists', 'city', 'country', 'type', 'title', 'benefits', 'big_cities']
widgets = {
'type': forms.Select(choices=(('1', 'Country'), ('2', 'City'))),
'city': forms.HiddenInput(attrs={'id': 'id_city'}),
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'}),
'main_descr': CKEditorWidget,
'benefits': CKEditorWidget,
'big_cities': CKEditorWidget,
}
def save(self, commit=True):

@ -38,7 +38,8 @@ class SpecialistCatalog(TranslatableModel):
translations = TranslatedFields(
title=models.CharField(max_length=255, verbose_name=u"Заголовок"),
main_descr=models.CharField(max_length=1000, verbose_name=u"Краткое описание"),
benefits=models.CharField(max_length=2000, verbose_name=u"Преимущества")
benefits=models.CharField(max_length=2000, verbose_name=u"Преимущества"),
big_cities=models.TextField(verbose_name=u"Крупные города")
)
def __init__(self, *args, **kwargs):
@ -49,9 +50,9 @@ class SpecialistCatalog(TranslatableModel):
def get_absolute_url(self):
global _country, _city
if self.type == _country:
return reverse_lazy('spec_catalog_country', tws(self.country.name))
return reverse_lazy('spec_catalog_country', kwargs={'slug':tws(self.country.name)})
else:
return reverse_lazy('spec_catalog_city', tws(self.city.name))
return reverse_lazy('spec_catalog_city', kwargs={'slug':tws(self.city.name)})
def save(self, *args, **kwargs):
super(SpecialistCatalog, self).save(*args, **kwargs)
@ -81,6 +82,9 @@ class SpecialistCatalog(TranslatableModel):
self.is_new = False
return self
def __unicode__(self):
return self.title
class Feedback(models.Model):
company = models.CharField(max_length=255, verbose_name=u"Название компании")
@ -89,4 +93,7 @@ class Feedback(models.Model):
logo = models.ImageField(verbose_name=u"Логотип компании", upload_to='specialist_catalog/feedback_logo/', blank=True)
catalog = models.ForeignKey(SpecialistCatalog, verbose_name=u"Страница")
def __unicode__(self):
return "Feedback from %s" % self.company

@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from django.conf.urls import url, patterns
from .views import *
from .views import CatalogDetailedCityView, CatalogDetailedCountryView
urlpaterns = patterns('',
urlpatterns = patterns('',
url(r'^city/(?P<slug>.*)/$', CatalogDetailedCityView.as_view(), name="spec_catalog_city"),
url(r'^country/(?P<slug>.*)/$', CatalogDetailedCountryView.as_view(), name="spec_catalog_country"),
)

@ -1,9 +1,17 @@
# -*- coding: utf-8 -*-
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, DetailView
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, FormView, DetailView
from django.views.generic.detail import SingleObjectMixin
from .forms import *
from django.core.urlresolvers import reverse_lazy
from django.conf import settings
from django.shortcuts import get_object_or_404
from service.order_forms import TranslationForm
from django.http import HttpResponseRedirect
# =========== ADMIN VIEWS ===========
# Specialist views
class SpecialistCreateView(CreateView):
@ -37,6 +45,9 @@ class SpecialistDeleteView(DeleteView):
success_url = reverse_lazy("specialist_all")
# Catalog views
class CatalogCreateView(CreateView):
form_class = SpecialistCatalogForm
model = SpecialistCatalog
@ -50,6 +61,26 @@ class CatalogListView(ListView):
paginate_by = settings.ADMIN_PAGINATION
class CatalogCityView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
qs = super(CatalogCityView, self).get_queryset()
return qs.filter(type=2)
class CatalogCountryView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
qs = super(CatalogCountryView, self).get_queryset()
return qs.filter(type=1)
class CatalogUpdateView(UpdateView):
form_class = SpecialistCatalogForm
model = SpecialistCatalog
@ -69,6 +100,9 @@ class CatalogDeleteView(DeleteView):
success_url = reverse_lazy("catalog_all")
# Feedback views
class FeedbackCreateView(CreateView):
form_class = FeedbackForm
model = Feedback
@ -76,14 +110,9 @@ class FeedbackCreateView(CreateView):
success_url = reverse_lazy("catalog_all")
def get_initial(self):
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('pk'))
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk'))
return {'catalog': catalog}
# class FeedbackListView(ListView):
# model = Feedback
# template_name = 'admin/specialist/feedback_all.html'
# paginate_by = settings.ADMIN_PAGINATION
class FeedbackUpdateView(UpdateView):
form_class = FeedbackForm
@ -92,10 +121,74 @@ class FeedbackUpdateView(UpdateView):
success_url = reverse_lazy("catalog_all")
def get_initial(self):
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('id'))
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk'))
return {'catalog': catalog}
class FeedbackDeleteView(DeleteView):
model = Feedback
template_name = 'admin/specialist/feedback_confirm_delete.html'
success_url = reverse_lazy("catalog_all")
# class FeedbackListView(ListView):
# model = Feedback
# template_name = 'admin/specialist/feedback_all.html'
# paginate_by = settings.ADMIN_PAGINATION
# ========= CLIENT VIEWS ============
class CatalogDetailedCityView(SingleObjectMixin, FormView):
model = SpecialistCatalog
form_class = TranslationForm
template_name = "client/specialist_catalog/catalog_detailed.html"
success_url = reverse_lazy("service_thanks")
def get_object(self, queryset=None):
obj = self.model.objects.language().get(city__url=self.kwargs.get('slug'))
self.object = obj
return obj
def get_context_data(self, **kwargs):
self.get_object()
context = super(CatalogDetailedCityView, self).get_context_data(**kwargs)
context['object'] = self.object
return context
def form_valid(self, form):
order = form.save(commit=False)
order.save()
return HttpResponseRedirect(self.success_url)
def get_initial(self):
obj = self.get_object()
return {'country':obj.country.name, 'city':obj.city.name}
class CatalogDetailedCountryView(SingleObjectMixin, FormView):
model = SpecialistCatalog
form_class = TranslationForm
template_name = "client/specialist_catalog/catalog_detailed.html"
success_url = reverse_lazy("service_thanks")
def get_object(self, queryset=None):
obj = self.model.objects.language().get(country__url=self.kwargs.get('slug'))
self.object = obj
return obj
def get_context_data(self, **kwargs):
self.get_object()
context = super(CatalogDetailedCountryView, self).get_context_data(**kwargs)
context['object'] = self.object
return context
def form_valid(self, form):
order = form.save(commit=False)
order.save()
return HttpResponseRedirect(self.success_url)
def get_initial(self):
obj = self.get_object()
return {'country':obj.country.name}

@ -12,8 +12,9 @@
<th>&nbsp; </th>
<th>Заголовок</th>
<th>Тип</th>
<th>{% if request.path == "/admin/specialist_catalog/catalog/city/" %}Город{% elif request.path == "/admin/specialist_catalog/catalog/country/" %}Страна{% else %}Страна/Город{% endif %}</th>
<th>Количество специалистов</th>
<th>Link</th>
<th>&nbsp;</th>
</tr>
</thead>
@ -26,8 +27,9 @@
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}</td>
<td>{{ item.title }}</td>
<td>{% if item.type == 1%}Страна{% else %}Город{% endif %}</td>
<td>{% if item.type == 1%}{{ item.country.name }}{% else %}{{ item.city.name }}{% endif %}</td>
<td>{{ item.specialists.count }}</td>
<td><a href="{{ item.get_absolute_url }}">Заценить</a></td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "catalog_edit" item.id %}'>
Изменить

@ -51,6 +51,14 @@
<span class="help-inline">{{ form.benefits.errors }}</span>
</div>
</div>
{# big_cities #}
<div class="control-group {% if form.big_cities.errors %}error{% endif %}">
<label class="control-label">{{ form.big_cities.label }}:</label>
<div class="controls">
{{ form.big_cities }}
<span class="help-inline">{{ form.big_cities.errors }}</span>
</div>
</div>
{# price #}
<div class="control-group {% if form.price.errors %}error{% endif %}">
@ -156,7 +164,7 @@
<td>{{ item.company }}</td>
<td>{{ item.text }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "feedback_edit" pk=object.id id=item.id %}'>
<a class="btn-small btn-info" href='{% url "feedback_edit" catalog_pk=object.id id=item.id %}'>
Изменить
</a>
</td>
@ -189,7 +197,7 @@
{% endwith %}
{% elif object.id %}
Отзывов еще нет,
<a class="btn btn-success" href='{% url "feedback_new" pk=object.id%}'>
<a class="btn btn-success" href='{% url "feedback_new" catalog_pk=object.id%}'>
<i class="icon-plus-sign icon-white"></i> Добавить </a>
{% endif %}
{% endblock %}

@ -0,0 +1,326 @@
{% extends "client/base_catalog.html" %}
{% load static %}
{% load thumbnail %}
{% load i18n %}
{% block head_scripts %}
{% endblock %}
{% block page_body%}
<div class="page-body clearfix request-form rq-translator">
<div class="m-article">
<div class="item-wrap place clearfix">
<aside>
<div class="i-pict">
{% thumbnail object.logo_preview "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
</aside>
<div class="i-info">
<header>
<div class="i-title">{{ object.title }}</div>
</header>
<div class="i-descr">
{{ object.main_descr }}
</div>
<hr/>
<div class="i-address map-opened country_map">
{# #}
<div class="i-map">
{% thumbnail object.place_photo "957x400" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
{# <!-- позиция для карты задается в атрибуте data-coords -->#}
{# <div class="map-canvas" id="map-canvas" data-coords="55.751898,37.545172" ></div>#}
{# <div class="close-map"><a class="toggle-map" href="#">Скрыть карту</a></div>#}
{# #}
{# <header>#}
{# <div class="show-map show-map_1"><a class="toggle-map" href="#">Раскрыть карту</a></div>#}
{# </header>#}
</div>
</div>
</div>
{{ object.big_cities }}
<div class="country_towns">
<h4>Крупные города:</h4>
{{ object.big_cities }}
</div>
<hr />
<div class="i-services country_content">
<div class="i-descr">
<h4>Коротко о наших преимуществах:</h4>
<div style="margin-top:20px;">
{{ object.benefits|safe }}
</div>
</div>
</div>
{# ----------------------------------------- FORM ----------------------------------------------#}
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
<form method="post">{% csrf_token %}
<hr />
<div class="rq-form-sect">
<div class="rqf-title">{% trans 'Информация о переводе' %}</div>
<div class="mf-line cols-2 rq-trans">
<div class="mf-field">
{{ form.languages }}
</div>
<div class="mf-field">
{{ form.themes }}
</div>
</div>
<div class="mf-line">
<label>Занятость:</label>
<div class="mf-field rq-tickets-days rq-num">
{{ form.days }} {% trans 'дней' %}
</div>
<div class="mf-field rq-tickets-num rq-num">
{{ form.hours }} {% trans 'часов в день' %}
</div>
</div>
<div class="mf-line rq-p-days">
<label>{% trans 'Даты работы' %}:</label>
<div class="mf-field">
<div class="period">
<div class="pwf-field validate-field{% if form.fr.errors %} error-field{% endif %}">
<label>{% trans 'с' %}</label>
{{ form.fr }}
<div class="error-blob">
{{ form.fr.errors }}
</div>
</div>
<div class="pwf-field validate-field{% if form.to.errors %} error-field{% endif %}">
<label>{% trans 'по' %}</label>
{{ form.to }}
<div class="error-blob">
{{ form.to.errors }}
</div>
</div>
</div>
</div>
</div>
</div>
<hr />
<div class="rq-form-sect">
<div class="rqf-title">{% trans 'Ваши контактные данные' %}</div>
{% if not object %}
<div class="mf-line rq-person ">
<div class="mf-field validate-field{% if form.event.errors %} error-field{% endif %}">
{{ form.event }}
<div class="error-blob">
{{ form.event.errors }}
</div>
</div>
</div>
{% endif %}
<div class="mf-line rq-person">
<div class="mf-field validate-field{% if form.person_inf.errors %} error-field{% endif %}">
{{ form.person_inf }}
<div class="error-blob">
{{ form.person_inf.errors }}
</div>
</div>
</div>
<div class="mf-line cols-2 rq-place">
<div class="mf-field validate-field rq-country{% if form.country.errors %} error-field{% endif %}">
{{ form.country }}
<div class="error-blob">
{{ form.country.errors }}
</div>
</div>
<div class="mf-field validate-field rq-city{% if form.city.errors %} error-field{% endif %}">
{{ form.city }}
<div class="error-blob">
{{ form.city.errors }}
</div>
</div>
</div>
<div class="mf-line cols-2 rq-contacts">
<div class="mf-field validate-field rq-tel{% if form.phone.errors %} error-field{% endif %}">
{{ form.phone }}
<div class="error-blob">
{{ form.phone.errors }}
</div>
</div>
<div class="mf-field validate-field rq-mail{% if form.person.errors %} error-field{% endif %}">
{{ form.person }}
<div class="error-blob">
{{ form.person.errors }}
</div>
</div>
</div>
</div>
<hr />
<div class="rq-btn-wrap">
<div class="rq-order-button">
<div class="rqob-wrap">
<div class="rqob-button">
<button type="submit">{% trans 'отправить запрос' %}</button>
</div>
</div>
</div>
</div>
</form>
</div>
{# ----------------------------------------- END FORM -------------------------------------------#}
<div class="rq-btn-wrap rq-btn-to-hide rq-to-hide">
<div class="rqb-cols">
<div class="rqb-button">
<div class="rq-order-button">
<div class="rqob-wrap">
<div class="rqob-price">от {{ object.price }} {{ object.currency }} / день</div>
<div class="rqob-button">
<a class="ob-text" href="#">заказать услугу</a>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
{% if request.GET.debug == '1' %}
<script src="{% static 'client/js/_modules/page.translator.js' %}"></script>
{% else %}
<script src="{% static 'client/js_min/_modules/page.translator.min.js' %}"></script>
{% endif %}
<script>
EXPO.translator.init({});
</script>
{% with object.specialists.all as specialists %}
{% if specialists %}
<div class="i-staff">
<div class="sect-title">Наши специалисты</div>
<div class="i-staff-list">
<ul>
{% for spec in specialists %}
<li>
<a href="#">
<div class="sl-item clearfix">
<div class="sl-pict">
{% thumbnail spec.photo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
<div class="sl-info">
<div class="sl-info-wrap">
<div class="sl-name">{{ spec.name }}</div>
<div class="sl-position">{{ spec.languages }}</div>
</div>
</div>
</div>
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% endwith %}
</div>
{% with object.feedback_set.all as feedbacks %}
{% if feedbacks %}
<div class="rq-to-hide">
<div class="s-comments">
<div class="sect-title">Отзывы клиентов:</div>
<div class="cat-list sc-comments">
{% for feedback in feedbacks %}
<div class="cl-item">
<div class="cl-item-wrap clearfix">
<div class="cli-pict">
{% thumbnail feedback.logo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
<div class="cli-info">
<div class="cli-top clearfix">
<header>
<div class="cli-title">{{ feedback.company }}</div>
</header>
</div>
<div class="sc-name">{{ feedback.name }}</div>
<div class="sc-text">
{{ feedback.text }}
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endwith %}
</div>
{% endblock %}
Loading…
Cancel
Save