diff --git a/accounts/forms.py b/accounts/forms.py index dd9bf7fb..5c47a7dc 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -57,9 +57,9 @@ class UserChangeForm(forms.ModelForm): class UserForm(forms.ModelForm): country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None, required=False) - city = forms.ModelChoiceField(label='Город', queryset=City.objects.all(), empty_label=None, required=False) - company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label=None, required=False) - organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label=None, required=False) + city = forms.ModelChoiceField(label='Город', queryset=City.objects.all(), empty_label='', required=False) + company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label='', required=False) + organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label='', required=False) title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) descriptions = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) keywords = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) diff --git a/accounts/models.py b/accounts/models.py index 7cad192d..b85e2f5e 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -50,10 +50,15 @@ class UserManager(BaseUserManager): user.is_active = True user.is_superuser = True user.is_admin = True - user.is_organiser = True user.save(using=self._db) return user + def safe_get(self, **kwargs): + model = self.model + try: + return model.objects.get(**kwargs) + except: + return None class User(AbstractBaseUser, PermissionsMixin): @@ -64,7 +69,6 @@ class User(AbstractBaseUser, PermissionsMixin): Email, first name, last name and password are required. Other fields are optional. """ - email = models.EmailField( verbose_name = 'Электронная почта', max_length = 255, @@ -79,18 +83,21 @@ class User(AbstractBaseUser, PermissionsMixin): is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле is_staff = models.BooleanField(default=0) is_admin = models.BooleanField(default=0) - is_translator = models.BooleanField(verbose_name='Переводчик', default=0) - is_organiser = models.BooleanField(verbose_name='Организатор', default=0) date_joined = models.DateTimeField(auto_now_add=True) date_registered = models.DateTimeField(blank=True, null=True)# date_modified = models.DateTimeField(auto_now=True) #relations + organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True, + on_delete=models.PROTECT) + translator = models.ForeignKey('translator.Translator', verbose_name='Переводчик', blank=True, null=True, + on_delete=models.PROTECT) country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, on_delete=models.PROTECT, related_name='users') city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True, on_delete=models.PROTECT) - company = models.ForeignKey('company.Company', blank=True, null=True, on_delete=models.PROTECT) + company = models.ForeignKey('company.Company', blank=True, null=True, on_delete=models.PROTECT, related_name='users') + #other user information phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True) position = models.CharField(verbose_name='Должность', max_length=255, blank=True) @@ -98,6 +105,7 @@ class User(AbstractBaseUser, PermissionsMixin): avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True) web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True) social = models.TextField(verbose_name='Социальные страници', blank=True) + skype = models.CharField(blank=True, max_length=50) #meta title = models.CharField(max_length=255, blank=True) descriptions = models.CharField(max_length=255, blank=True) @@ -146,9 +154,6 @@ class TranslatorProfile(models.Model): """ Extra information about translators """ - #required field, relation with user model - user = models.ForeignKey(User, related_name='translator') - #other fields education = models.CharField(verbose_name='Образование', max_length=255, blank=True) specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True) languages = models.CharField(verbose_name='Языки', max_length=255, blank=True) @@ -163,6 +168,7 @@ class TranslatorProfile(models.Model): #need import after User Model, because User imported in "organiser.models" from organiser.models import Organiser +''' def create_profiles(sender, **kw): """ create Translator profile if "is_translator" field in User model true @@ -208,7 +214,7 @@ def create_profiles(sender, **kw): post_save.connect(create_profiles, sender=User) - +''' """ class MyUserAuthBackend(object): diff --git a/accounts/templates/create_admin.html b/accounts/templates/create_admin.html deleted file mode 100644 index 14db2814..00000000 --- a/accounts/templates/create_admin.html +++ /dev/null @@ -1,68 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block scripts %} -{% endblock %} - -{% block body%} -
{% csrf_token %} -
- Создать администратора - -
-
-

-
-
- {# email #} -
- -
- {{ form.email }} - {{ form.email.errors }} -
-
- {# password1 #} -
- -
- {{ form.password1 }} - {{ form.password1.errors }} -
-
- {# password2 #} -
- -
- {{ form.password2 }} - {{ form.password2.errors }} -
-
- {# first_name #} -
- -
- {{ form.first_name }} - {{ form.first_name.errors }} -
-
- {# last_name #} -
- -
- {{ form.last_name }} - {{ form.last_name.errors }} -
-
-
-
- -
- - -
- -
-
- -{% endblock %} \ No newline at end of file diff --git a/accounts/templates/translator_change.html b/accounts/templates/translator_change.html deleted file mode 100644 index e738d55b..00000000 --- a/accounts/templates/translator_change.html +++ /dev/null @@ -1,75 +0,0 @@ -{% extends 'base.html' %} - - -{% block body %} -
{% csrf_token %} -
- Изменить переводчика - -
-
-

Информация

-
-
- {# education #} -
- -
{{ form.education }} - {{ form.education.errors }} -
-
- {# specialization #} -
- -
{{ form.specialization }} - {{ form.specialization.errors }} -
-
- {# languages #} -
- -
{{ form.languages }} - {{ form.languages.errors }} -
-
- {# native_language #} -
- -
{{ form.native_language }} - {{ form.native_language.errors }} -
-
- {# car #} -
- -
{{ form.car }} - {{ form.car.errors }} -
-
- {# prices #} -
- -
{{ form.prices }} - {{ form.prices.errors }} -
-
- {# discounts #} -
- -
{{ form.discounts }} - {{ form.discounts.errors }} -
-
-
-
- -
- - -
- - -
-
- -{% endblock %} \ No newline at end of file diff --git a/accounts/templates/translators.html b/accounts/templates/translators.html deleted file mode 100644 index bb32209c..00000000 --- a/accounts/templates/translators.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends 'base.html' %} - -{% block body %} -
-
-

Список переводчиков

-
-
- - - - - - - - - - - - {% for item in objects %} - - - - - - - {% if item.is_translator %} - - {% else %} - - {% endif %} - - - - {% endfor %} - -
idEmailПолное имяПереводчик 
{{ item.id }}{{ item.email }}{{ item.get_full_name }}Да  - - Изменить - -
- -
- {# pagination #} - - -
- - -{% endblock %} \ No newline at end of file diff --git a/accounts/templates/user_all.html b/accounts/templates/user_all.html deleted file mode 100644 index 68a7dcdd..00000000 --- a/accounts/templates/user_all.html +++ /dev/null @@ -1,68 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block body %} - -
-
-

Список пользователей

-
-
- - - - - - - - - - - - - {% for item in objects %} - - - - - - {% if item.is_admin %} - - {% else %} - - {% endif %} - - {% if item.is_translator %} - - {% else %} - - {% endif %} - - - - {% endfor %} - -
idEmailПолное имяАдминПереводчик 
{{ item.id }}{{ item.email }}{{ item.get_full_name }}Да Да  - - Изменить - -
- -
- {# pagination #} - - -
- - -{% endblock %} \ No newline at end of file diff --git a/accounts/templates/user_change.html b/accounts/templates/user_change.html deleted file mode 100644 index a4f6705e..00000000 --- a/accounts/templates/user_change.html +++ /dev/null @@ -1,220 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block scripts %} - - - {# selects #} - - - - - - - -{% endblock %} - -{% block body %} -
{% csrf_token %} -
- Изменить пользователя - -
-
-

Основная информация

-
-
- {{ form.user_id }} - {# email #} -
- -
- {{ form.email }} - {{ form.email.errors }} -
-
- {# first_name #} -
- -
- {{ form.first_name }} - {{ form.first_name.errors }} -
-
- {# last_name #} -
- -
- {{ form.last_name }} - {{ form.last_name.errors }} -
-
- {# url #} -
- -
- {{ form.url }} - {{ form.url.errors }} -
-
- {# country #} -
- -
- {{ form.country }} - {{ form.country.errors }} -
-
- {# city #} -
- -
- {{ form.city }} - {{ form.city.errors }} -
-
- {# position #} -
- -
- {{ form.position }} - {{ form.position.errors }} -
-
-
-
- -
-
-

Дополнительная информация

-
-
- {# avatar #} -
- -
- {{ form.avatar }} - {{ form.avatar.errors }} -
-
- {# about #} -
- -
- {{ form.about }} - {{ form.about.errors }} -
-
- {# phone #} -
- -
- {{ form.phone }} - {{ form.phone.errors }} -
-
- {# web_page #} -
- -
- {{ form.web_page }} - {{ form.web_page.errors }} -
-
- {# social #} -
- -
- {{ form.social }} - {{ form.social.errors }} -
-
- {# company #} -
- -
- {{ form.company }} - {{ form.company.errors }} -
-
- {# organiser #} -
- -
- {{ form.organiser }} - {{ form.organiser.errors }} -
-
- {# is_translator #} -
- -
- {{ form.is_translator }} - {{ form.is_translator.errors }} -
-
-
-
-
-
-

Мета данные

-
-
- {# descriptions #} -
- -
- {{ form.descriptions }} - {{ form.descriptions.errors }} -
-
- {# title #} -
- -
- {{ form.title }} - {{ form.title.errors }} -
-
- {# keywords #} - - -
- {{ form.keywords }} - {{ form.keywords.errors }} -
-
- -
- -
- - -
- - -
-
- - - -{% comment %} -{% for field in form %} - - {{ field }} - -{% endfor %} -{% endcomment %} - -{% endblock %} \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index da46e646..0af8e5b7 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -61,14 +61,12 @@ def user_change(request, url): Return form of user and post it on the server. If form is posted redirect on the page of all users. """ - try: - try: - user = User.objects.get(id=url) - user_id = getattr(user, 'id') - except: - user = User.objects.get(url=url) - user_id = getattr(user, 'id') - except: + user = User.objects.safe_get(id=url) + # try get user by url if doesnt work by id + if user is None: + user = User.objects.safe_get(url=url) + #redirect to list of all users if cannot find user + if user is None: return HttpResponseRedirect('/accounts/all') if request.POST: diff --git a/city/models.py b/city/models.py index 3fa6e7a7..d40b4056 100644 --- a/city/models.py +++ b/city/models.py @@ -1,10 +1,15 @@ # -*- coding: utf-8 -*- -from django.db import models +from django.db import models, connection from hvad.models import TranslatableModel, TranslatedFields from bitfield import BitField # my models from directories.models import Iata from service.models import Service +# +from functions.db import db_table_exists + +#check if table exist and create flags if true +flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] class City(TranslatableModel): @@ -15,20 +20,6 @@ class City(TranslatableModel): """ - try: - flags = [str(item.id) for item in Service.objects.all()] - except: - flags = [] - - """ - ids = [item.id for item in Service.objects.all() ] - if len(ids): - max = sorted(ids)[-1] - for i in range(max): - flags.append(str(i)) - """ - - services = BitField(flags=flags) url = models.SlugField(unique=True) diff --git a/company/forms.py b/company/forms.py index a5655626..e84d80b8 100644 --- a/company/forms.py +++ b/company/forms.py @@ -3,6 +3,7 @@ from django import forms from django.conf import settings from ckeditor.widgets import CKEditorWidget from django.core.exceptions import ValidationError +from django.forms.util import ErrorList #models from models import Company from country.models import Country @@ -10,7 +11,7 @@ from theme.models import Theme from city.models import City #functions from functions.translate import populate_all, fill_trans_fields_all -from functions.form_check import is_positive_integer +from functions.form_check import is_positive_integer, translit_with_separator from functions.files import check_tmp_files from functions.custom_fields import LocationWidget @@ -49,6 +50,8 @@ class CompanyForm(forms.Form): widget=forms.TextInput(attrs={'placeholder': 'Год основания'})) #field for comparing tmp files key = forms.CharField(required=False, widget=forms.HiddenInput()) + # + company_id = forms.CharField(required=False, widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): @@ -95,7 +98,7 @@ class CompanyForm(forms.Form): company.tag.clear() #simple fields - company.url = data['url'] + company.url = translit_with_separator(data['url']).lower() company.staff_number = data['staff_number'] company.address = data['address'] company.phone = data['phone'] @@ -136,6 +139,18 @@ class CompanyForm(forms.Form): #save files check_tmp_files(company, data['key']) + def clean(self): + id = self.cleaned_data.get('company_id') + url = self.cleaned_data.get('url') + + company = Company.objects.filter(url=translit_with_separator(url)) + if company and str(company[0].id) != id: + msg = 'Такой урл уже занят' + self._errors['url'] = ErrorList([msg]) + del self.cleaned_data['url'] + + return self.cleaned_data + def clean_foundation(self): """ diff --git a/company/models.py b/company/models.py index 1df31e28..cb8b2bb0 100644 --- a/company/models.py +++ b/company/models.py @@ -1,10 +1,19 @@ # -*- coding: utf-8 -*- from django.db import models -from hvad.models import TranslatableModel, TranslatedFields +from hvad.models import TranslatableModel, TranslatedFields, TranslationManager # from functions.custom_fields import LocationField +class CompanyManager(TranslationManager): + def safe_get(self, **kwargs): + model = self.model + try: + return model.objects.get(**kwargs) + except: + return None + + class Company(TranslatableModel): """ Create Company model @@ -12,7 +21,9 @@ class Company(TranslatableModel): Uses hvad.TranslatableModel which is child of django.db.models class """ - url = models.CharField(verbose_name='URL', max_length=255) + objects = CompanyManager() + + url = models.SlugField() #relations theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль', blank=True, null=True, related_name='companies') diff --git a/company/urls.py b/company/urls.py index 765d3e13..a6a9037a 100644 --- a/company/urls.py +++ b/company/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import patterns, include, url urlpatterns = patterns('company.views', url(r'^add.*/$', 'company_add'), - url(r'^delete/(?P\d+)/$', 'company_delete'), - url(r'^change/(?P\d+).*/$', 'company_change'), + url(r'^delete/(?P.*)/$', 'company_delete'), + url(r'^change/(?P.*).*/$', 'company_change'), url(r'^all/$', 'company_all'), ) \ No newline at end of file diff --git a/company/views.py b/company/views.py index 706f3f69..d0bad0f6 100644 --- a/company/views.py +++ b/company/views.py @@ -31,24 +31,28 @@ def company_add(request): return add_object_with_file(request, CompanyForm, 'company_add.html', '/company/all/', {'city': City, 'tag': Tag}) -def company_delete(request, company_id): - return delete_object(request, Company, CompanyDeleteForm, company_id, '/company/all') +def company_delete(request, url): + return delete_object(request, Company, CompanyDeleteForm, url, '/company/all') @login_required -def company_change(request, company_id): +def company_change(request, url): """ Return form and fill it with existing Company object data. If form is posted redirect on the page of all companies. """ - try: - #check if company_id exists else redirect to the list of companies - company = Company.objects.get(id=company_id) - file_form = FileModelForm(initial={'model': 'company.Company'}) - except: + company = Company.objects.safe_get(url=url) + # try get company by id if doesnt work by url + if company is None: + company = Company.objects.safe_get(id=url) + #redirect to list of all companies if cannot find user + if company is None: return HttpResponseRedirect('/company/all/') + company_id = getattr(company, 'id') + file_form = FileModelForm(initial={'model': 'company.Company'}) + if request.POST: form = CompanyForm(request.POST) #set choices filled by ajax @@ -62,7 +66,8 @@ def company_change(request, company_id): #fill form with data from database data = {'url':company.url, 'staff_number':company.staff_number, 'address': company.address, 'phone':company.phone, 'fax':company.fax, 'web_page':company.web_page, - 'email':company.email, 'social':company.social, 'foundation': company.foundation} + 'email':company.email, 'social':company.social, 'foundation': company.foundation, + 'company_id':company.id} if company.country: data['country'] = company.country.id @@ -83,7 +88,7 @@ def company_change(request, company_id): data['keywords_%s' % code] = obj.keywords data['descriptions_%s' % code] = obj.descriptions #fill form - form = CompanyForm(data) + form = CompanyForm(initial=data) #set choices filled by ajax form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] diff --git a/country/models.py b/country/models.py index 9c439435..2c125ecc 100644 --- a/country/models.py +++ b/country/models.py @@ -9,6 +9,11 @@ from service.models import Service #func from functions.custom_fields import EnumField from bitfield import BitField +from functions.db import db_table_exists + +#check if table exist and create flags if true +flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] + class Country(TranslatableModel): """ @@ -17,13 +22,6 @@ class Country(TranslatableModel): Uses hvad.TranslatableModel which is child of django.db.models class """ - try: - flags = [str(item.id) for item in Service.objects.all()] - except: - flags = [] - #max = sorted(ids)[-1] - #for i in range(max): - # flags.append(str(i)) services = BitField(flags=flags) diff --git a/functions/db.py b/functions/db.py new file mode 100644 index 00000000..ac5a7582 --- /dev/null +++ b/functions/db.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from django.db import connection + +def db_table_exists(table_name): + """ + return true if table exist + """ + return table_name in connection.introspection.table_names() diff --git a/organiser/forms.py b/organiser/forms.py index b55c525a..a97f5692 100644 --- a/organiser/forms.py +++ b/organiser/forms.py @@ -12,7 +12,7 @@ from place_exposition.models import PlaceExposition from place_conference.models import PlaceConference #functions from functions.translate import populate_all, fill_trans_fields_all -from functions.form_check import is_positive_integer +from functions.form_check import is_positive_integer, translit_with_separator from functions.files import check_tmp_files from functions.custom_fields import LocationWidget @@ -105,7 +105,7 @@ class OrganiserForm(forms.Form): organiser.place_exposition.clear() #simple fields - organiser.url = data['url'] + organiser.url = translit_with_separator(data['url']).lower() organiser.address = data['address'] organiser.phone = data['phone'] organiser.fax = data['fax'] diff --git a/organiser/models.py b/organiser/models.py index b7313d6f..151ddc94 100644 --- a/organiser/models.py +++ b/organiser/models.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from django.db import models -from hvad.models import TranslatableModel, TranslatedFields +from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from accounts.models import User from django.db.models.signals import post_save #custom functions @@ -8,6 +8,14 @@ from functions.translate import fill_trans_fields_all, populate_all from functions.custom_fields import LocationField from functions.form_check import translit_with_separator +class OrganiserManager(TranslationManager): + def safe_get(self, **kwargs): + model = self.model + try: + return model.objects.get(**kwargs) + except: + return None + class Organiser(TranslatableModel): """ @@ -16,7 +24,8 @@ class Organiser(TranslatableModel): Uses hvad.TranslatableModel which is child of django.db.models class """ - user = models.ForeignKey(User, related_name='organiser') + #set manager of this model + objects = OrganiserManager() url = models.SlugField(verbose_name='URL', blank=True) #relations @@ -58,23 +67,4 @@ class Organiser(TranslatableModel): modified = models.DateTimeField(auto_now=True) def __unicode__(self): - return self.lazy_translation_getter('name', self.pk) - -''' -def create_organiser(sender, **kw): - """ - create Organiser profile if "is_organiser" field in User model true - if it's false delete Organiser profile connected to User - """ - user = kw["instance"] - if user.is_organiser: - organiser = Organiser(user=user) - organiser.save() - else: - try: - Organiser.objects.get(user = user).delete() - except: pass - - -post_save.connect(create_organiser, sender=User) -''' \ No newline at end of file + return self.lazy_translation_getter('name', self.pk) \ No newline at end of file diff --git a/organiser/urls.py b/organiser/urls.py index 26cb1444..ed8d98ef 100644 --- a/organiser/urls.py +++ b/organiser/urls.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('', - url(r'^add.*/$', 'organiser.views.organiser_add'), - url(r'^change/(?P\d+).*/$', 'organiser.views.organiser_change'), - url(r'^all/$', 'organiser.views.organiser_all'), +urlpatterns = patterns('organiser.views', + url(r'^add.*/$', 'organiser_add'), + url(r'^change/(?P.*).*/$', 'organiser_change'), + url(r'^all/$', 'organiser_all'), ) \ No newline at end of file diff --git a/organiser/views.py b/organiser/views.py index 30aa060f..d7c9ae12 100644 --- a/organiser/views.py +++ b/organiser/views.py @@ -36,18 +36,23 @@ def organiser_add(request): choices={'city': City, 'tag': Tag}) -def organiser_change(request, organiser_id): +def organiser_change(request, url): """ Return form and fill it with existing Organiser object data. If form is posted redirect on the page of all organisers. """ - try: - #check if organiser_id exists else redirect to the list of organisers - organiser = Organiser.objects.get(id=organiser_id) - file_form = FileModelForm(initial={'model': 'organiser.Organiser'}) - except: + organiser = Organiser.objects.safe_get(url=url) + # try get user by id if doesnt work by url + if organiser is None: + organiser = Organiser.objects.safe_get(id=url) + #redirect to list of all organisers if cannot find organiser + if organiser is None: return HttpResponseRedirect('/organiser/all/') + #get id + organiser_id = getattr(organiser, 'id') + #init FileModelForm + file_form = FileModelForm(initial={'model': 'organiser.Organiser'}) if request.POST: form = OrganiserForm(request.POST) @@ -62,7 +67,7 @@ def organiser_change(request, organiser_id): #fill form with data from database data = {'staff_number':organiser.staff_number, 'address': organiser.address, 'events_number':organiser.events_number, 'phone':organiser.phone, - 'fax':organiser.fax, 'web_page':organiser.web_page, + 'fax':organiser.fax, 'web_page':organiser.web_page, 'url':organiser.url, 'email':organiser.email, 'social':organiser.social, 'foundation': organiser.foundation} if organiser.country: @@ -91,8 +96,8 @@ def organiser_change(request, organiser_id): #fill form form = OrganiserForm(initial=data) #set choices filled by ajax - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data.get('country'))] + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data.get('theme'))] args = {} args.update(csrf(request)) diff --git a/proj/settings.py b/proj/settings.py index 73a67302..5e4ebb95 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -206,6 +206,7 @@ INSTALLED_APPS = ( 'seminar', 'service', 'theme', + 'translator', 'webinar', #django modules 'hvad', diff --git a/proj/urls.py b/proj/urls.py index edbc2d4f..aeddc1ec 100644 --- a/proj/urls.py +++ b/proj/urls.py @@ -27,6 +27,7 @@ urlpatterns = patterns('', url(r'^seminar/', include('seminar.urls')), url(r'^service/', include('service.urls')), url(r'^theme/', include('theme.urls')), + url(r'^translator/', include('translator.urls')), url(r'^webinar/', include('webinar.urls')), url(r'^settings/$', 'proj.views.settings'), url(r'^language/add/', 'directories.views.language_add'), diff --git a/templates/admin/accounts/user_all.html b/templates/admin/accounts/user_all.html index 68a7dcdd..6fab9de1 100644 --- a/templates/admin/accounts/user_all.html +++ b/templates/admin/accounts/user_all.html @@ -38,7 +38,7 @@   {% endif %} - + Изменить diff --git a/templates/admin/company/company_add.html b/templates/admin/company/company_add.html index 4c1e251f..5b8f31a4 100644 --- a/templates/admin/company/company_add.html +++ b/templates/admin/company/company_add.html @@ -41,6 +41,9 @@
{# Hidden inputs uses for comparing with TmpFile objects #} {{ form.key }} + {# Hidden input uses in clean method for checking url #} + {{ form.company_id }} + {# name #} {% with field='name' form=form languages=languages %} diff --git a/templates/admin/company/company_all.html b/templates/admin/company/company_all.html index fce83cfc..18f814e6 100644 --- a/templates/admin/company/company_all.html +++ b/templates/admin/company/company_all.html @@ -26,7 +26,7 @@ Displays lists of all companies in the table {{ item.name }} - + Изменить diff --git a/templates/admin/organiser/organiser_add.html b/templates/admin/organiser/organiser_add.html index 6452f30d..851f3eeb 100644 --- a/templates/admin/organiser/organiser_add.html +++ b/templates/admin/organiser/organiser_add.html @@ -166,6 +166,13 @@ {% with field='representation' form=form languages=languages %} {% include 'admin/forms/multilang.html' %} {% endwith %} + {# url #} +
+ +
{{ form.url }} + {{ form.url.errors }} +
+
diff --git a/translator/__init__.py b/translator/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/translator/forms.py b/translator/forms.py new file mode 100644 index 00000000..435ae4ac --- /dev/null +++ b/translator/forms.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.conf import settings +from ckeditor.widgets import CKEditorWidget +from models import Translator +from country.models import Country +from city.models import City +#functions +from functions.translate import populate_all, fill_trans_fields_all +from functions.files import check_tmp_files +from functions.form_check import translit_with_separator + + + +class TranslatorForm(forms.Form): + """ + Create Translator form for creating translator + + __init__ uses for dynamic creates fields + + save function saves data in Translator object. If it doesnt exist create new object + """ + car = forms.BooleanField(label='Личный автомобиль', required=False) + birth = forms.DateField(label='Дата рождения') + gender = forms.ChoiceField(label='Пол', choices=[('male', 'Мужской'),('female', 'Женский')]) + + + def __init__(self, *args, **kwargs): + """ + create dynamical translated fields fields + """ + super(TranslatorForm, self).__init__(*args, **kwargs) + #creates translated forms example: name_ru, name_en + # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs + if len(settings.LANGUAGES) in range(10): + for lid, (code, name) in enumerate(settings.LANGUAGES): + # uses enumerate for detect iteration number + # first iteration is a default lang so it required fields + required = True if lid == 0 else False + self.fields['education_%s' % code] = forms.CharField(label='Образование', required=required) + self.fields['specialization_%s' % code] = forms.CharField(label='Специализация', required=required) + self.fields['languages_%s' % code] = forms.CharField(label='Языки', required=required) + self.fields['native_language_%s' % code] = forms.CharField(label='Родной язык', required=required) + self.fields['prices_%s' % code] = forms.CharField(label='Цены', + required=required, widget=CKEditorWidget) + self.fields['discounts_%s' % code] = forms.CharField(label='Скидки', + required=False, widget=CKEditorWidget) + #meta data + self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + + def save(self, id=None): + #create new conference object or get exists + if not id: + translator = Translator() + else: + translator = Translator.objects.get(id=id) + + data = self.cleaned_data + + translator.car = data['car'] + translator.birth = data['birth'] + translator.gender = data['gender'] + + #will be saved populated fields + zero_fields = {} + #fills all translated fields with data + #if saves new object, will fill city object. otherwise existing object of City model + fill_trans_fields_all(Translator, translator, data, id, zero_fields) + #autopopulate + #populate empty fields and fields which was already populated + conference_id = getattr(conference, 'id') + populate_all(Conference, data, conference_id, zero_fields) + #save files + check_tmp_files(conference, data['key']) \ No newline at end of file diff --git a/translator/models.py b/translator/models.py new file mode 100644 index 00000000..8bacfa8f --- /dev/null +++ b/translator/models.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from django.db import models +from hvad.models import TranslatableModel, TranslatedFields, TranslationManager +# +from functions.custom_fields import EnumField + + +class TranslatorManager(TranslationManager): + def safe_get(self, **kwargs): + model = self.model + try: + return model.objects.get(**kwargs) + except: + return None + + +class Translator(TranslatableModel): + """ + Extra information about translators + """ + #set manager of this model + objects = TranslationManager() + + gender = EnumField(values=('male', 'female')) + + birth = models.DateField(verbose_name='Дата рождения') + car = models.BooleanField(verbose_name='Личный автомобиль', default=0) + + translations = TranslatedFields( + education = models.CharField(verbose_name='Образование', max_length=255), + specialization = models.CharField(verbose_name='Специализация', max_length=255), + languages = models.CharField(verbose_name='Языки', max_length=255), + native_language= models.CharField(verbose_name='Родной язык', max_length=255), + + prices = models.TextField(verbose_name='Тарифы'), + discounts = models.TextField(verbose_name='Скидки', blank=True), + #-----meta + title = models.CharField(max_length=255, blank=True), + descriptions = models.CharField(max_length=255, blank=True), + keywords = models.CharField(max_length=255, blank=True), + ) \ No newline at end of file diff --git a/translator/tests.py b/translator/tests.py new file mode 100644 index 00000000..501deb77 --- /dev/null +++ b/translator/tests.py @@ -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) diff --git a/translator/urls.py b/translator/urls.py new file mode 100644 index 00000000..38200c85 --- /dev/null +++ b/translator/urls.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, url + +urlpatterns = patterns('translator.views', + url(r'^add.*/$', 'translator_add'), + url(r'^delete/(?P.*)/$', 'translator_delete'), + url(r'^change/(?P.*)/$', 'translator_change'), + url(r'^all/$', 'translator_all'), +) diff --git a/translator/views.py b/translator/views.py new file mode 100644 index 00000000..3cc328ad --- /dev/null +++ b/translator/views.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect +from django.core.context_processors import csrf +from django.conf import settings +from django.contrib.auth.decorators import login_required +#models and forms +from models import Translator +#custom views +from functions.custom_views import objects_list, delete_object \ No newline at end of file