added specialist catalog models and form. view only form specialist model,

remotes/origin/1203
Ivan Kovalkovskyi 11 years ago
parent d81ea6a432
commit 9fe7370f26
  1. 13
      exposition/models.py
  2. 1
      proj/admin_urls.py
  3. 3
      proj/settings.py
  4. 0
      specialist_catalog/__init__.py
  5. 11
      specialist_catalog/admin_urls.py
  6. 86
      specialist_catalog/forms.py
  7. 89
      specialist_catalog/models.py
  8. 16
      specialist_catalog/tests.py
  9. 6
      specialist_catalog/urls.py
  10. 30
      specialist_catalog/views.py
  11. 54
      templates/admin/specialist/specialist_all.html
  12. 11
      templates/admin/specialist/specialist_confirm_delete.html
  13. 79
      templates/admin/specialist/specialist_new.html

@ -160,7 +160,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
paid_new = models.ForeignKey('expobanner.Paid', blank=True, null=True, on_delete=models.SET_NULL)
top = models.ForeignKey('expobanner.Top', blank=True, null=True, on_delete=models.SET_NULL)
main = models.ForeignKey('expobanner.MainPage', blank=True, null=True, on_delete=models.SET_NULL)
#set manager of this model(fisrt manager is default)
objects = ExpoManager()
enable = ClientManager()
@ -309,18 +308,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def theme_ids(self):
return [item['id'] for item in self.theme.all().values('id')]
def get_main_link(self):
if self.main:
return self.main.link.get_click_link()
else:
return self.get_permanent_url()
def get_top_link(self):
if self.top:
return self.top.link.get_click_link()
else:
return self.get_permanent_url()
class Statistic(TranslatableModel):
exposition = models.ForeignKey(Exposition, related_name='statistic')

@ -34,6 +34,7 @@ urlpatterns = required(
url(r'^settings/', include('settings.admin_urls')),
url(r'^meta/', include('meta.admin_urls')),
url(r'^import_xls/', include('import_xls.admin_urls')),
url(r'^specialist_catalog/', include('specialist_catalog.admin_urls')),
url(r'^language/add/', 'directories.admin.language_add'),
url(r'^currency/add/', 'directories.admin.currency_add'),

@ -353,7 +353,8 @@ INSTALLED_APPS = (
'password_reset', # reset password
'social.apps.django_app.default', # social auth
'core',
'wizard'
'wizard',
'specialist_catalog',
)

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
from django.conf.urls import url, patterns
from .views import *
urlpaterns = patterns('',
url(r'^specialist/new/$', SpecialistCreateView.as_view(), name='specialist_new'),
url(r'^specialist/all/$', SpecialistListView.as_view(), name='specialist_all'),
url(r'^specialist/edit/(?P<pk>\d{1,4})/$', SpecialistUpdateView.as_view(), name='specialist_edit'),
url(r'^specialist/delete/(?P<pk>\d{1,4})/$', SpecialistDeleteView.as_view(), name='specialist_delete'),
)

@ -0,0 +1,86 @@
# -*- coding: utf-8 -*-
from django import forms
from hvad.forms import TranslatableModelForm
from .models import Specialist, SpecialistCatalog, Feedback, City, Country
from ckeditor.widgets import CKEditorWidget
from django.utils.translation import get_language
country_choices = [(c.id, c.name) for c in Country.objects.all()]
lang_code = get_language()[:2]
default_text = u"Планируете посетить выставку в %s?" \
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \
u"%s, мы можем предоставить профессионалов со знанием разных " \
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \
u"специалиста, города и объема работы."
default_title = u"Переводчики в %s"
class SpecialistCatalogForm(TranslatableModelForm):
class Meta:
model = SpecialistCatalog
fields = '__all__'
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,
}
def clean_city(self):
data = self.cleaned_data
if data.get('city'):
data['city'] = City.objects.language(lang_code).get(id=data['city'])
return data
def clean_country(self):
data = self.cleaned_data
if data.get('country'):
data['country'] = Country.objects.language(lang_code).get(id=data['country'])
return data
def save(self, commit=True):
place = self.cleaned_data.get('city') or self.cleaned_data.get('country')
place_inflect = place.inflect or place.name
if not self.cleaned_data['title']:
self.cleaned_data['title'] = default_title % place_inflect
if not self.cleaned_data['main_descr']:
self.cleaned_data['main_descr'] = default_text % (place_inflect, place_inflect)
return super(SpecialistCatalogForm, self).save(commit=True)
class SpecialistForm(forms.ModelForm):
class Meta:
model = Specialist
fields = '__all__'
widgets = {
'city': forms.HiddenInput(attrs={'id': 'id_city'}),
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'})
}
def clean_city(self):
data = self.cleaned_data
if data.get('city'):
data['city'] = City.objects.language(lang_code).get(id=data['city'])
return data
def clean_country(self):
data = self.cleaned_data
if data.get('country'):
data['country'] = Country.objects.language(lang_code).get(id=data['country'])
return data
class FeedbackForm(forms.ModelForm):
class Meta:
model = Feedback
fields = '__all__'
widgets = {
'text':CKEditorWidget
}

@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
from django.db import models
from django.conf import settings
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from functions.form_check import translit_with_separator as tws
from city.models import City
from country.models import Country
from django.core.urlresolvers import reverse_lazy
import copy
# types of catalog
_country = 1
_city = 2
class Specialist(models.Model):
name = models.CharField(max_length=255, verbose_name=u"Полное имя")
languages = models.CharField(max_length=255, verbose_name=u"Языки")
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город")
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна")
photo = models.ImageField(verbose_name=u"Фото", upload_to="specialist_catalog/specialist_photo/", blank=True)
class SpecialistCatalog(TranslatableModel):
price = models.IntegerField(verbose_name=u"Цена", default=200)
currency = models.CharField(max_length=255, verbose_name=u"Валюта", default=u"EUR")
logo_preview = models.ImageField(verbose_name=u"Логотип", blank=True, upload_to='/specialist_catalog/logo_preview/')
place_photo = models.ImageField(verbose_name=u"Фото для города", blank=True, upload_to='/specialist_catalog/place_photo/')
specialists = models.ManyToManyField(Specialist, verbose_name=u"Специалисты", blank=True)
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город")
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна")
type = models.PositiveSmallIntegerField(verbose_name=u"Тип(Страна/Город)", default=2)
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"Преимущества")
)
def __init__(self, *args, **kwargs):
super(SpecialistCatalog, self).__init__(*args, **kwargs)
self.cache_fields = ['title', 'main_descr', 'benefits']
self.is_new = True
def get_absolute_url(self):
global _country, _city
if self.type == _country:
return reverse_lazy('spec_catalog_country', tws(self.country.name))
else:
return reverse_lazy('spec_catalog_city', tws(self.city.name))
def save(self, *args, **kwargs):
super(SpecialistCatalog, self).save(*args, **kwargs)
self.initial_language = 'ru'
new_values = {field: getattr(self, field) for field in self.cache_fields}
langs = [code for code, _ in settings.LANGUAGES]
if self.is_new:
for lang in langs:
if lang not in self.get_available_languages():
self.translate(lang)
for key, value in new_values.items():
setattr(self, key, value)
self.save_translations(self)
else:
translations = {obj.language_code:obj for obj in list(self.translations.all())}
for lang in langs:
if lang is not self.initial_language:
tr = translations[lang]
for key, value in new_values.items():
#if u'%s' % getattr(tr, key) is u'%s' % self.var_cache[key]:
setattr(tr, key, value)
tr.save()
self.lazy_translation_getter(self.initial_language)
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = False
return self
class Feedback(models.Model):
company = models.CharField(max_length=255, verbose_name=u"Название компании")
name = models.CharField(max_length=100, verbose_name=u"Имя")
text = models.CharField(max_length=5000, verbose_name=u"Текст отзыва")
logo = models.ImageField(verbose_name=u"Логотип компании", upload_to='/specialist_catalog/feedback_logo/', blank=True)
catalog = models.ForeignKey(SpecialistCatalog, verbose_name=u"Страница")

@ -0,0 +1,16 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.conf.urls import url, patterns
from .views import *
urlpaterns = patterns('',
)

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, DetailView
from .forms import *
from django.core.urlresolvers import reverse
class SpecialistCreateView(CreateView):
form_class = SpecialistForm
model = Specialist
template_name = 'admin/specialist/specialist_new.html'
success_url = reverse("specialist_all")
class SpecialistListView(ListView):
model = Specialist
template_name = 'admin/specialist/specialist_all.html'
class SpecialistUpdateView(UpdateView):
form_class = SpecialistForm
model = Specialist
template_name = 'admin/specialist/specialist_new.html'
success_url = reverse("specialist_all")
class SpecialistDeleteView(DeleteView):
model = Specialist
template_name = 'admin/specialist/specialist_confirm_delete.html'
success_url = reverse("specialist_all")

@ -0,0 +1,54 @@
{% extends 'base.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список специалистов(переводчиков)</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>Имя</th>
<th>Заголовок</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td><a href = "{{ item.url }}/">{{ item.url }}</a></td>
<td>{{ item.title }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "seo_edit" item.id %}'>
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href='{% url "seo_delete" item.id %}'>
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href='{% url "seo_new" %}'>
<i class="icon-plus-sign icon-white"></i> Добавить seo-текст </a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if page_obj.has_previous %}
<li> <a href="?page={{ page_obj.previous_page_number }}"></a></li>
{% endif %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,79 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
{{ request.LANGUAGE_CODE }}
<form method="post" class="form-horizontal" > {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# url/slug #}
<div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls">
{{ form.langs }}
{{ form.url }}<span class="help-inline"></span>
<span class="help-inline">{{ form.url.errors }}</span>
</div>
</div>
{# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label">{{ form.title.label }}:</label>
<div class="controls">
{{ form.title }}
<span class="help-inline">{{ form.title.errors }}</span>
</div>
</div>
{# page title #}
<div class="control-group {% if form.page_title.errors %}error{% endif %}">
<label class="control-label">{{ form.page_title.label }}:</label>
<div class="controls">
{{ form.page_title }}
<span class="help-inline">{{ form.page_title.errors }}</span>
</div>
</div>
{# description #}
<div class="control-group {% if form.description.errors %}error{% endif %}">
<label class="control-label">{{ form.description.label }}:</label>
<div class="controls">
{{ form.description }}
<span class="help-inline">{{ form.description.errors }}</span>
</div>
</div>
{# body #}
<div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label>
<div class="controls">
{{ form.body }}
<span class="help-inline">{{ form.body.errors }}</span>
</div>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/meta/seo/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/>
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}
Loading…
Cancel
Save