diff --git a/functions/admin_views.py b/functions/admin_views.py index 5a0f1802..0fb38183 100644 --- a/functions/admin_views.py +++ b/functions/admin_views.py @@ -25,6 +25,11 @@ class AdminView(FormView): obj = get_object_or_404(self.model, slug=slug) self.obj = obj return obj + id = self.kwargs.get('id') + if id: + obj = get_object_or_404(self.model, id=id) + self.obj = obj + return obj self.obj = None return None diff --git a/meta/admin.py b/meta/admin.py new file mode 100644 index 00000000..ceb59ac9 --- /dev/null +++ b/meta/admin.py @@ -0,0 +1,68 @@ +# -*- 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.forms.formsets import BaseFormSet, formset_factory +from django.forms.models import modelformset_factory +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.decorators import login_required +#models and forms +from models import MetaSetting +from forms import MetaForm, MetaFilterForm +from theme.models import Tag +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm, FileForm +from photologue.forms import PhotoForm +#python +import random +#custom views +from functions.custom_views import objects_list, delete_object +from functions.views_help import get_referer + +from functions.admin_views import AdminListView, AdminView, upload_photo + + + +class MetaListView(AdminListView): + template_name = 'admin/meta/meta_list.html' + form_class = MetaFilterForm + model = MetaSetting + +class MetaView(AdminView): + form_class = MetaForm + model = MetaSetting + success_url = '/admin/meta/all/' + template_name = 'admin/meta/meta_setting.html' + + def form_valid(self, form): + self.set_obj() + expo = form.save(obj=self.obj) + + return HttpResponseRedirect(self.success_url) + + def get_form(self, form_class): + if self.request.POST: + return super(MetaView, self).get_form(form_class) + obj = self.set_obj() + if obj: + data = {'name':obj.name} + + for code, name in settings.LANGUAGES: + trans_obj = self.model._meta.translations_model.objects.get(language_code = code,master__id=obj.id) #access to translated fields + data['title_%s' % code] = trans_obj.title + data['description_%s' % code] = trans_obj.description + data['keywords_%s' % code] = trans_obj.keywords + data['h1_%s' % code] = trans_obj.h1 + + form =form_class(initial=data) + return form + else: + return form_class() + + + def get_context_data(self, **kwargs): + context = super(MetaView, self).get_context_data(**kwargs) + obj = self.set_obj() + return context \ No newline at end of file diff --git a/meta/admin_urls.py b/meta/admin_urls.py new file mode 100644 index 00000000..f2062f38 --- /dev/null +++ b/meta/admin_urls.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, include, url +from admin import MetaListView, MetaView + +urlpatterns = patterns('conference.admin', + + url(r'^all/$', MetaListView.as_view()), + #url(r'^change/(?P.*)/$', 'conference_change'), + url(r'^(?P.*)/$', MetaView.as_view()), + url(r'^$', MetaView.as_view()), +) \ No newline at end of file diff --git a/meta/decorators.py b/meta/decorators.py new file mode 100644 index 00000000..b0b3bcbf --- /dev/null +++ b/meta/decorators.py @@ -0,0 +1,23 @@ +from meta.views import Meta + +def add_meta(view): + def wrapper(request, *args, **kwargs): + """ + meta = Meta( + title=title, + description=description, + keywords=keywords, + meta_extras = { + 'viewport': 'width=device-width, initial-scale=1.0, minimum-scale=1.0' + } + 'extra_custom_props': [ + ('http-equiv', 'Content-Type', 'text/html; charset=UTF-8'), + ] + ) + """ + + + r = view(request, *args, **kwargs) + r.context_data = {'foo': 'bar'} + return r.render() + return wrapper \ No newline at end of file diff --git a/meta/forms.py b/meta/forms.py new file mode 100644 index 00000000..ee8983cc --- /dev/null +++ b/meta/forms.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.conf import settings +from models import MetaSetting +from functions.translate import fill_with_signal +from functions.admin_forms import AdminFilterForm + + +class MetaForm(forms.Form): + name = forms.CharField(label=u'Название страницы') + + def __init__(self, *args, **kwargs): + """ + create dynamical translated fields fields + """ + super(MetaForm, 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['title_%s' % code] = forms.CharField(label=u'Title', required=required, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + self.fields['description_%s' % code] = forms.CharField(label=u'Description', required=required, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + self.fields['keywords_%s' % code] = forms.CharField(label=u'Keywords', required=False, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + self.fields['h1_%s' % code] = forms.CharField(label=u'H1', required=False, + widget=forms.TextInput(attrs={'style':'width: 550px'})) + + def save(self, obj=None): + data = self.cleaned_data + if not obj: + meta = MetaSetting() + else: + meta = obj + + meta.name = data['name'] + + + # fill translated fields and save object + fill_with_signal(MetaSetting, meta, data) + meta.save() + +class MetaFilterForm(AdminFilterForm): + model = MetaSetting \ No newline at end of file diff --git a/meta/models.py b/meta/models.py index 39f32f06..d3b8c36b 100644 --- a/meta/models.py +++ b/meta/models.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- from django.db import models -from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from django.utils import translation +from django.db.models.signals import post_save +from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from pymorphy.django_conf import default_morph as morph +from functions.signal_handlers import post_save_handler class MetaSetting(TranslatableModel): name = models.CharField(max_length=100, unique=True) @@ -51,6 +53,4 @@ class MetaSetting(TranslatableModel): return s - - - +post_save.connect(post_save_handler, sender=MetaSetting) \ No newline at end of file diff --git a/proj/admin_urls.py b/proj/admin_urls.py index f601f170..2ceee92f 100644 --- a/proj/admin_urls.py +++ b/proj/admin_urls.py @@ -29,6 +29,7 @@ urlpatterns = required( url(r'^translator/', include('translator.admin_urls')), url(r'^webinar/', include('webinar.admin_urls')), url(r'^settings/', include('settings.admin_urls')), + url(r'^meta/', include('meta.admin_urls')), url(r'^language/add/', 'directories.admin.language_add'), url(r'^currency/add/', 'directories.admin.currency_add'), # ajax requests diff --git a/proj/settings.py b/proj/settings.py index 6b1ac110..b8ca7a03 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -22,7 +22,7 @@ DATABASES = { 'NAME': 'test2', 'USER': 'kotzilla', 'PASSWORD': 'qazedc', - 'HOST': '', + 'HOST': '195.66.79.152', 'PORT': '', } } @@ -322,7 +322,7 @@ INSTALLED_APPS = ( 'bitfield', 'djutils', 'pytils', - #'pymorphy', + 'pymorphy', 'password_reset', #'social_auth', 'social.apps.django_app.default', @@ -336,7 +336,7 @@ DEBUG_TOOLBAR_PATCH_SETTINGS = False # 'debug_toolbar.panels.profiling.ProfilingPanel', #) PYMORPHY_DICTS = { - 'ru': { 'dir': '/home/www/proj/settings/russian_dicts' }, + 'ru': { 'dir': os.path.join(SITE_ROOT, 'settings/russian_dicts')} #'/home/www/proj/settings/russian_dicts' }, } # search backend diff --git a/templates/admin/meta/meta_list.html b/templates/admin/meta/meta_list.html new file mode 100644 index 00000000..f03f661b --- /dev/null +++ b/templates/admin/meta/meta_list.html @@ -0,0 +1,57 @@ +{% extends 'admin_list.html' %} +{% load static %} + +{% block body %} + +
+
+

Фильтры

+
+
+
+ {{ form }} + + +
+
+ +
+ +
+
+

Список мета настроек

+
+
+ + + + + + + + + + {% for item in object_list %} + + + + + + + + + + + {% endfor %} + +
Страница 
{{ item.name }} + + Изменить + +
+ Добавить настройку +
+ {# pagination #} + {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/admin/meta/meta_setting.html b/templates/admin/meta/meta_setting.html new file mode 100644 index 00000000..187e4658 --- /dev/null +++ b/templates/admin/meta/meta_setting.html @@ -0,0 +1,60 @@ +{% extends 'base.html' %} +{% load static %} +{# Displays article form #} + + {% block scripts %} + + + {# selects #} + + + + {# ajax #} + + + + {% endblock %} + +{% block body %} +
{% csrf_token %} +
+ {% if article %} Изменить {% else %} Добавить {% endif %}настройку{% if article %}(на сайте){% endif %} + +
+
+

+
+
+ {# name #} +
+ +
+ {{ form.name }} + {{ form.name.errors }} +
+
+ + {# title #} + {% include 'admin/forms/multilang.html' with field='title' form=form languages=languages %} + + + {# description #} + {% include 'admin/forms/multilang.html' with field='description' form=form languages=languages %} + {# keywords #} + {% include 'admin/forms/multilang.html' with field='keywords' form=form languages=languages %} + {# title #} + {% include 'admin/forms/multilang.html' with field='h1' form=form languages=languages %} + +
+ +
+ +
+ + + +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/client/includes/accounts/calendar_list.html b/templates/client/includes/accounts/calendar_list.html index 47c1600b..f27fa55c 100644 --- a/templates/client/includes/accounts/calendar_list.html +++ b/templates/client/includes/accounts/calendar_list.html @@ -12,7 +12,9 @@
- + {% if request.user in event.users.all %} + + {% endif %}
diff --git a/templates/client/includes/accounts/calendar_table.html b/templates/client/includes/accounts/calendar_table.html index 3a81bb28..6aa41324 100644 --- a/templates/client/includes/accounts/calendar_table.html +++ b/templates/client/includes/accounts/calendar_table.html @@ -82,18 +82,20 @@ {% if event|in_event:day %} {% if day.month == event.data_begin.month %} {% if day.day == event.data_begin.day %} - +

{{ event.name|safe }}

- + {% if request.user in event.users.all %} + + {% endif %}
{{ event.country }}, {{ event.city }} - {% if event.plave %} + {% if event.place %} , {{ event.place.address.address }} {% endif %}
@@ -103,27 +105,35 @@ {% endif %} {% else %} - {% if day.day == event.data_end.day %} + {% comment %} + {% if day.day == event.data_end.day %}
+

{{ event.name|safe }}

- + {% if request.user in event.users.all %} + + {% endif %}
{{ event.country }}, {{ event.city }} - {% if event.plave %} + {% if event.place %} , {{ event.place.address.address }} {% endif %}
+ +
{% endif %} + {% endcomment %} + {% endif %} {% else %} {% ifnotequal day current_day %} diff --git a/templates/client/includes/exposition/exposition_list.html b/templates/client/includes/exposition/exposition_list.html index 935259e1..1010d87a 100644 --- a/templates/client/includes/exposition/exposition_list.html +++ b/templates/client/includes/exposition/exposition_list.html @@ -27,14 +27,12 @@
- {% if obj.quality_label.ufi.is_set %}
{% endif %} -
diff --git a/templates/client/includes/exposition/search_result.html b/templates/client/includes/exposition/search_result.html index ba43851a..a5b55444 100644 --- a/templates/client/includes/exposition/search_result.html +++ b/templates/client/includes/exposition/search_result.html @@ -35,7 +35,7 @@
- + {{ result.object.main_title|safe }}
@@ -60,32 +60,23 @@
-
- {% trans 'услуги' %} -
- + {% include 'client/includes/exposition/services.html' with obj=result.object %} + {% include 'client/includes/calendar_button.html' with obj=result.object %} + +
+ {% with note=result.object|note_by_user:request.user %} + {% trans 'заметка' %} +
+
+ +
+ {% endwith %}
- - {% if user.is_authenticated %} - {% if result.object|in_calendar:user %} - {% trans 'из расписания' %} - {% else %} - {% trans 'в расписание' %} - {% endif %} - {% else %} - {% trans 'в расписание' %} - {% endif %} - - {% trans 'заметка' %}
- {% trans 'Лучшие цены на отели на' %} Booking.com + {% include 'client/buttons/booking_button.html' with object=result.object %}
@@ -100,11 +91,25 @@ {% endif %}
- {% with obj=result.object filter=filter %} - {% include 'includes/show_tags.html' %} - {% endwith %} + {% include 'client/includes/exposition/tags.html' with obj=result.object %}
{% endfor %} + +{% block scripts %} + + +{% endblock %}