parent
d81ea6a432
commit
9fe7370f26
13 changed files with 385 additions and 14 deletions
@ -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> </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…
Reference in new issue