From 1946a04da46ed23f01fe3a371d2362ad51df99b5 Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Tue, 26 Nov 2013 14:26:48 +0200 Subject: [PATCH] commit --- exposition/admin.py | 37 +++++++++ exposition/models.py | 24 +++++- exposition/urls.py | 2 + proj/admin_urls.py | 3 +- proj/settings.py | 4 +- proj/views.py | 67 +-------------- settings/__init__.py | 0 settings/admin.py | 17 ++++ settings/forms.py | 43 ++++++++++ settings/models.py | 81 +++++++++++++++++++ settings/tests.py | 16 ++++ settings/urls.py | 6 ++ settings/views.py | 1 + .../admin/exposition/exposition_all.html | 43 ++++++++++ templates/admin/settings/settings.html | 17 ++++ templates/test.html | 9 +++ 16 files changed, 304 insertions(+), 66 deletions(-) create mode 100644 settings/__init__.py create mode 100644 settings/admin.py create mode 100644 settings/forms.py create mode 100644 settings/models.py create mode 100644 settings/tests.py create mode 100644 settings/urls.py create mode 100644 settings/views.py create mode 100644 templates/admin/settings/settings.html create mode 100644 templates/test.html diff --git a/exposition/admin.py b/exposition/admin.py index 834d8d41..0b963609 100644 --- a/exposition/admin.py +++ b/exposition/admin.py @@ -26,6 +26,43 @@ def exposition_all(request): """ return objects_list(request, Exposition, 'exposition_all.html') +@login_required +def exposition_switch(request, url, action): + """ + turn on or off exposition + + take: + url as url of exposition + + action as action what to do('on' or 'off') + + """ + exposition = Exposition.objects.safe_get(url=url) + if not exposition: + return HttpResponse('error') + else: + if action == 'on': + exposition.on() + return HttpResponse('on') + elif action == 'off': + exposition.off() + return HttpResponse('off') + else: + return HttpResponse('error') + + +@login_required +def exposition_copy(request, url): + exposition = Exposition.objects.safe_get(url=url) + if not exposition: + return HttpResponse('error') + else: + exposition.pk = None + exposition.url += '_copy' + exposition.is_published = False + exposition.cancel_by_administrator = False + exposition.save() + return HttpResponse('success') @login_required def exposition_add(request): diff --git a/exposition/models.py b/exposition/models.py index 9dec5d7f..6a6dbc92 100644 --- a/exposition/models.py +++ b/exposition/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 functions.custom_fields import EnumField @@ -11,12 +11,24 @@ AUDIENCE1 = ((None,'Не выбрано'), AUDIENCE = (None,'experts', 'experts and consumers', 'general public') CURRENCY = ('RUB', 'USD', 'EUR') + +class ExpositionManager(TranslationManager): + def safe_get(self, **kwargs): + model = self.model + try: + return model.objects.get(**kwargs) + except: + return None + class Exposition(TranslatableModel): """ Create Exposition model Uses hvad.TranslatableModel which is child of django.db.models class """ + #set manager of this model + objects = ExpositionManager() + url = models.SlugField(unique=True) data_begin = models.DateField(verbose_name='Дата начала') data_end = models.DateField(verbose_name='Дата окончания') @@ -88,6 +100,16 @@ class Exposition(TranslatableModel): def cancel(self): self.canceled_by_administrator = True + def on(self): + self.is_published = True + self.canceled_by_administrator = False + self.save() + + def off(self): + self.is_published = False + self.canceled_by_administrator = True + self.save() + class TimeTable(TranslatableModel): """ diff --git a/exposition/urls.py b/exposition/urls.py index 693e2299..20cf1d45 100644 --- a/exposition/urls.py +++ b/exposition/urls.py @@ -6,4 +6,6 @@ urlpatterns = patterns('exposition.admin', url(r'^delete/(?P.*)/$', 'exposition_delete'), url(r'^change/(?P.*)/$', 'exposition_change'), url(r'^all/$', 'exposition_all'), + url(r'^switch/(?P.*)/(?P.*)$', 'exposition_switch'), + url(r'^copy/(?P.*)$', 'exposition_copy'), ) diff --git a/proj/admin_urls.py b/proj/admin_urls.py index b703201e..1c01bd06 100644 --- a/proj/admin_urls.py +++ b/proj/admin_urls.py @@ -21,7 +21,8 @@ urlpatterns = patterns('', 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'^settings/$', 'proj.views.settings'), + url(r'^settings/$', include('settings.urls')), url(r'^language/add/', 'directories.admin.language_add'), url(r'^currency/add/', 'directories.admin.currency_add'), # diff --git a/proj/settings.py b/proj/settings.py index f552c124..624287ba 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -163,7 +163,8 @@ TEMPLATE_DIRS = ( '/home/kotzilla/Documents/qwer/proj/templates/admin/organiser', '/home/kotzilla/Documents/qwer/proj/templates/admin/place_conference', '/home/kotzilla/Documents/qwer/proj/templates/admin/place_exposition', - '/home/kotzilla/Documents/qwer/proj/templates/admin/proj', + #'/home/kotzilla/Documents/qwer/proj/templates/admin/proj', + '/home/kotzilla/Documents/qwer/proj/templates/admin/settings', '/home/kotzilla/Documents/qwer/proj/templates/admin/seminar', '/home/kotzilla/Documents/qwer/proj/templates/admin/service', '/home/kotzilla/Documents/qwer/proj/templates/admin/theme', @@ -231,6 +232,7 @@ INSTALLED_APPS = ( 'review', 'seminar', 'service', + 'settings', 'theme', 'translator', 'webinar', diff --git a/proj/views.py b/proj/views.py index fa026682..e5fb93ec 100644 --- a/proj/views.py +++ b/proj/views.py @@ -1,84 +1,25 @@ # -*- coding: utf-8 -*- from django.core.context_processors import csrf -from settings import LANGUAGES from django.shortcuts import render_to_response from django.http import HttpResponseRedirect, HttpResponse from django.contrib.contenttypes.models import ContentType -from forms import SettingsForm -from models import Settings +#from forms import SettingsForm +#from models import Settings from django.contrib.auth.decorators import login_required -from seminar.models import Seminar + from file.models import TmpFile, FileModel from file.forms import FileModelForm -from country.models import Country from city.models import City from theme.models import Tag -from django.shortcuts import get_object_or_404 from django.db.models.loading import get_model @login_required def home(request): return render_to_response('base.html') -@login_required -def settings(request): - """ - Return form of settings and saves changes - - """ - if request.POST: - form = SettingsForm(request.POST) - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin') - else: - form = SettingsForm() - - args = {} - args.update(csrf(request)) - - args['languages'] = LANGUAGES - args['form'] = form - - return render_to_response('settings.html', args) - - -from directories.models import Currency -from country.models import Country -from country.forms import CountryForm -from file.forms import FileModelForm -from django.views.decorators.cache import cache_page - -#from django.core.cache import cache - -#@cache_page(30) def test(request): - ids = [i for i in range(1, 5000)] - form = CountryForm() - file_form = FileModelForm - c = Country.objects.get(id=5) - country_id = getattr(c, 'id') - - #args = {} - for i in range(1,10000): - args = {'languages': LANGUAGES, 'form': form, 'file_form': file_form, 'obj_id': country_id, 'files':FileModel.objects.filter(content_type=ContentType.objects.get_for_model(c), object_id=getattr(c, 'id'))} - #args['languages'] = LANGUAGES - #args['form'] = form - #args['file_form'] = file_form - #args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(c), object_id=getattr(c, 'id')) - #args['obj_id'] = country_id - - - - #currs = [item for item in Currency.objects.all()] - #currs = [] - #for i in ids: - # currs.append(Currency.objects.get(id=i)) - - #cache.set('key', currs[100].currency, 60) - - return HttpResponse(args) + return render_to_response('test.html') diff --git a/settings/__init__.py b/settings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/settings/admin.py b/settings/admin.py new file mode 100644 index 00000000..9d4e3ec3 --- /dev/null +++ b/settings/admin.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +from django.core.context_processors import csrf +from django.conf import settings +from django.contrib.auth.decorators import login_required +# +from forms import SettingsForm + + + +@login_required +def change_settings(request): + form = SettingsForm() + args = {'form': form, 'languages': settings.LANGUAGES} + args.update(csrf(request)) + return render_to_response('settings.html', args) \ No newline at end of file diff --git a/settings/forms.py b/settings/forms.py new file mode 100644 index 00000000..a57099c8 --- /dev/null +++ b/settings/forms.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +from django import forms +from models import Setting +from django.conf import settings +from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all + + +class SettingsForm(forms.Form): + """ + Create Settings form for creating settings + + __init__ uses for dynamic creates fields + + save function saves data in Settings object. If it doesnt exist create new object + """ + + def __init__(self, *args, **kwargs): + super(SettingsForm, self).__init__(*args, **kwargs) + # creates translated form fields, example: name_ru, name_en + # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs + settings_list = Setting.objects.all() + for item in settings_list: + if item.type != 'transl': + self.fields['%s'%item.key] = forms.CharField(label='%s'%item.key, initial=item.get_value(), + required=False) + else: + if len(settings.LANGUAGES) in range(10): + for lid, (code, name) in enumerate(settings.LANGUAGES): + # using enumerate for detect iteration number + # first iteration is a default lang so it required fields + required = True if lid == 0 else False + self.fields['%s_%s' %(item.key, code)] = forms.CharField(label=getattr(item, 'key'), initial=item.get_value(code), + required=required,widget=forms.TextInput(attrs={'style':'width: 450px'})) + + + def save(self): + """ + changes Settings model + """ + data = self.cleaned_data + capacity_tmpl = Setting.objects.get(key='hall_template') + for code, name in settings.LANGUAGES: + capacity_tmpl.set_value(data['hall_capacity_tmpl_%s'%code], code) \ No newline at end of file diff --git a/settings/models.py b/settings/models.py new file mode 100644 index 00000000..d688b521 --- /dev/null +++ b/settings/models.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +from django.db import models +from hvad.models import TranslatableModel, TranslatedFields +from django.conf import settings + +# +from functions.custom_fields import EnumField + + + + +class Setting(TranslatableModel): + """ + Create Settings model, which stores different settings of project + + Uses hvad.TranslatableModel which is child of django.db.models class + """ + VALUES = ('int', 'text', 'transl', 'date') + + key = models.CharField(max_length=50) + type = EnumField(values=VALUES) + int = models.IntegerField(blank=True, null=True) + text = models.CharField(max_length=255, blank=True) + date = models.DateTimeField(blank=True, null=True) + + translations = TranslatedFields( + transl = models.CharField(max_length=255, blank=True,default='111'), + name = models.CharField(max_length=50), + ) + + def __unicode__(self): + return self.key + + def get_value(self, code=None): + """ + returns value of setting + value can be - int, text, date or translated field + + """ + if self.type == 'transl': + obj = Setting._meta.translations_model.objects.get(language_code = code,master__id=getattr(self, 'id')) + return getattr(obj, self.type) + else: + return getattr(self,self.type) + + def set_value(self, value, code=None): + """ + sets value of setting + """ + if self.type == 'transl': + obj = Setting._meta.translations_model.objects.get(language_code = code,master__id=getattr(self, 'id')) + setattr(obj, self.type, value) + obj.save() + else: + setattr(self, self.type, value) + + +from django.db.models.signals import post_save +from django.dispatch import receiver + + +#@receiver(post_save, sender=Setting) +def create_transl_fields(sender, **kw): + """ + + """ + setting = kw['instance'] + setting.text = '111' + setting.save() + #if kwargs['created'] and setting.type == 'transl': + # setting.int = 1 + #if len(setting.LANGUAGES) in range(10): + # for lid, (code, name) in enumerate(settings.LANGUAGES): + # using enumerate for detect iteration number + # first iteration is a default lang so it required fields + + + + + +#post_save.connect(create_transl_fields, sender=Setting) \ No newline at end of file diff --git a/settings/tests.py b/settings/tests.py new file mode 100644 index 00000000..501deb77 --- /dev/null +++ b/settings/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/settings/urls.py b/settings/urls.py new file mode 100644 index 00000000..743f686f --- /dev/null +++ b/settings/urls.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, include, url + +urlpatterns = patterns('settings.admin', + url(r'^$', 'change_settings'), +) diff --git a/settings/views.py b/settings/views.py new file mode 100644 index 00000000..60f00ef0 --- /dev/null +++ b/settings/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/templates/admin/exposition/exposition_all.html b/templates/admin/exposition/exposition_all.html index e0188a21..aebed633 100644 --- a/templates/admin/exposition/exposition_all.html +++ b/templates/admin/exposition/exposition_all.html @@ -1,5 +1,40 @@ {% extends 'base.html' %} +{% block scripts %} + +{% endblock %} + {% block body %}
@@ -25,6 +60,14 @@ {{ item.data_begin }} + + Отключить + + + Включить + Изменить diff --git a/templates/admin/settings/settings.html b/templates/admin/settings/settings.html new file mode 100644 index 00000000..c582570f --- /dev/null +++ b/templates/admin/settings/settings.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} + + +{% block body %} + +
{% csrf_token %} + + {% for field in form %} + {{ field.name }} + {% with field='{{ field.int }}' form=form languages=languages %} + {% include 'admin/forms/multilang.html' %} + {% endwith %} + + {% endfor %} + +
+{% endblock %} \ No newline at end of file diff --git a/templates/test.html b/templates/test.html new file mode 100644 index 00000000..29db4ceb --- /dev/null +++ b/templates/test.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} + +{% block body %} + +
+ {{ form }} + +
+{% endblock %} \ No newline at end of file