From 22b010d372622512b8a8a7dd3fe4dfc246aa3fcc Mon Sep 17 00:00:00 2001 From: Kotiuk Nazarii Date: Fri, 17 Jul 2015 15:28:34 +0300 Subject: [PATCH] Services controling. Start working --- conference/admin.py | 19 ++++- conference/admin_urls.py | 1 + conference/models.py | 10 +++ service/admin.py | 28 ++++++++ service/admin_urls.py | 5 +- service/forms.py | 27 ++++++- service/models.py | 13 ++++ static/custom_js/find_events.js | 47 +++++++++++++ templates/admin/service/control.html | 70 +++++++++++++++++++ templates/admin/service/control_list.html | 39 +++++++++++ templates/admin/settings/main_page.html | 45 +----------- .../indexes/conference/conference_text.txt | 4 +- 12 files changed, 258 insertions(+), 50 deletions(-) create mode 100644 static/custom_js/find_events.js create mode 100644 templates/admin/service/control.html create mode 100644 templates/admin/service/control_list.html diff --git a/conference/admin.py b/conference/admin.py index d5d063b5..c1bfa2b1 100644 --- a/conference/admin.py +++ b/conference/admin.py @@ -295,4 +295,21 @@ class ConferenceListView(AdminListView): model = Conference def upload_conference_photo(request, conf_id): - return upload_photo(request, conf_id, Conference) \ No newline at end of file + return upload_photo(request, conf_id, Conference) + + +from django.utils import translation +from haystack.query import SearchQuerySet +import json +from exposition.admin import get_by_lang + +def search_conf(request): + term = request.GET['term'].capitalize() + lang = translation.get_language() + if not term: + qs = SearchQuerySet().models(Conference).order_by('text')[:30] + else: + qs = SearchQuerySet().models(Conference).autocomplete(content_auto=term).order_by('text')[:30] + result = [{'id': item.pk, 'label': get_by_lang(item, 'name', lang)} for item in qs] + + return HttpResponse(json.dumps(result), content_type='application/json') diff --git a/conference/admin_urls.py b/conference/admin_urls.py index 9a206a58..2b8cc0df 100644 --- a/conference/admin_urls.py +++ b/conference/admin_urls.py @@ -9,6 +9,7 @@ urlpatterns = patterns('conference.admin', #url(r'^change/(?P.*)/$', 'conference_change'), url(r'^switch/(?P.*)/(?P.*)$', 'conference_switch'), + url(r'^search/$', 'search_conf'), url(r'^(?P.*)/$', ConferenceView.as_view()), url(r'^$', ConferenceView.as_view()), diff --git a/conference/models.py b/conference/models.py index 6767797e..067371db 100644 --- a/conference/models.py +++ b/conference/models.py @@ -5,6 +5,7 @@ from django.db import models from django.db.models import Q from django.db.models.signals import post_save, pre_save from django.contrib.contenttypes import generic +from django.utils import translation from exposition.manager import ClientManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from functions.translate import fill_with_signal @@ -172,6 +173,15 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): def tags(self): return self.tag.language().all() + def get_index_text(self): + translation.activate('ru') + translations = self.translations.all() + names = ' '.join([tr.name for tr in translations]) + titles = ' '.join([tr.main_title for tr in translations]) + themes = ' '.join([' '.join(theme.get_all_names()) for theme in self.theme.all()]) + tags = ' '.join([' '.join(tag.get_all_names()) for tag in self.tag.all()]) + return names + ' ' + titles + ' ' + themes + ' ' + tags + def get_gallery(self): if self.photogallery: return self.photogallery diff --git a/service/admin.py b/service/admin.py index 584ec09e..91ae029d 100644 --- a/service/admin.py +++ b/service/admin.py @@ -4,6 +4,7 @@ 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 django.views.generic import ListView, FormView #models and forms from models import Service from forms import ServiceForm, ServiceDeleteForm @@ -114,3 +115,30 @@ def get_city(request): return render_to_response('checkbox_option.html', {'options': cities}) else: return HttpResponse('error') + + +class ServiceControlList(ListView): + model = Service + template_name = 'admin/service/control_list.html' + paginate_by = 20 + +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import FormMixin +from django.views.generic import DetailView +from service.forms import ServiceControlForm +class ServiceControl(FormMixin, DetailView): + form_class = ServiceControlForm + template_name = 'admin/service/control.html' + model = Service + + + def get_form(self, form_class): + obj = self.object + data = obj.get_current_state() + + return form_class(data) + + def get_context_data(self, **kwargs): + context = super(ServiceControl, self).get_context_data(**kwargs) + context['form'] = self.get_form(self.form_class) + return context \ No newline at end of file diff --git a/service/admin_urls.py b/service/admin_urls.py index 682785fc..4dda045f 100644 --- a/service/admin_urls.py +++ b/service/admin_urls.py @@ -2,8 +2,11 @@ from django.conf.urls import patterns, include, url from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \ ParticipationListView, RemoteListView,TicketsListView +from service.admin import ServiceControlList, ServiceControl urlpatterns = patterns('service.admin', + url(r'^control/list/$', ServiceControlList.as_view()), + url(r'^control/(?P.*)/$', ServiceControl.as_view()), url(r'^add.*/$', 'service_add'), url(r'^delete/(?P.*)/$', 'service_delete'), url(r'^change/(?P.*)/$', 'service_change'), @@ -17,6 +20,6 @@ urlpatterns = patterns('service.admin', url(r'order/tickets/$', TicketsListView.as_view()), #ajax url(r'^get_city/$', 'get_city'), - #url(r'^get_country/$', 'get_country'), +#url(r'^get_country/$', 'get_country'), ) diff --git a/service/forms.py b/service/forms.py index 1431a76e..16664611 100644 --- a/service/forms.py +++ b/service/forms.py @@ -121,4 +121,29 @@ class ServiceDeleteForm(forms.ModelForm): class Meta: model = Service - fields = ('url',) \ No newline at end of file + fields = ('url',) + + +from country.models import Area, Country +from exposition.models import Exposition +from conference.models import Conference + +class ServiceControlForm(forms.Form): + event = [{'verbose': 'Выставки', 'model': Exposition, 'id': 1}, + {'verbose': 'Конференции', 'model': Conference, 'id': 2}] + region = forms.ChoiceField(required=False, label='Регион', + choices=[('', '')]+[(item.id, item.name) + for item in list(Area.objects.all())]) + country = forms.MultipleChoiceField(required=False, label='Страны', + choices=[('', '')]+[(item.id, item.name) + for item in list(Country.objects.all())]) + country_all = forms.BooleanField() + expositions = forms.CharField(label=u'Выставки', widget=forms.HiddenInput(), required=False) + conferences = forms.CharField(label=u'Конференции', widget=forms.HiddenInput(), required=False) + + def __init__(self, *args, **kwargs): + super(ServiceControlForm, self).__init__(*args, **kwargs) + self.fields['event_type'] = forms.MultipleChoiceField(required=False, label = 'Тип события', + widget=forms.CheckboxSelectMultiple(), + choices=[(item['id'], item['verbose']) + for item in self.event]) \ No newline at end of file diff --git a/service/models.py b/service/models.py index e490e574..ae9d8196 100644 --- a/service/models.py +++ b/service/models.py @@ -47,6 +47,19 @@ class Service(TranslatableModel): def get_price(self): pr = self.price + def get_current_state(self): + """ + uses for control form + :return: + """ + state = {'event_type':[1, 2], + 'region': [], + 'country':[], + 'country_all': True, + 'expositions': [], + 'conferences': []} + return state + diff --git a/static/custom_js/find_events.js b/static/custom_js/find_events.js new file mode 100644 index 00000000..a92cb126 --- /dev/null +++ b/static/custom_js/find_events.js @@ -0,0 +1,47 @@ +function make_event_select(id, url, placeholder){ + $(id).select2({ + placeholder: placeholder, + multiple: true, + ajax: { + + url: url, + width: '550px', + dataType: "json", + quietMillis: 200, + multiple: true, + + data: function(term, page, theme){ + return {term: term, + page: page}; + }, + + results: function (data) { + var results = []; + $.each(data, function(index, item){ + results.push({ + id: item.id, + text: item.label + }); + }); + return {results: results}; + } + }, + initSelection : function(element, callback) { + var data = []; + $(element.val().split(",")).each(function(i) { + var item = this.split(':'); + data.push({ + id: item[0], + text: item[1] + }); + }); + callback(data); + } + }); +} + + +$(document).ready(function(){ + make_event_select('#id_expositions', '/admin/exposition/search/', 'Выставки'); + make_event_select('#id_conferences', '/admin/conference/search/', 'Конференции'); +}); diff --git a/templates/admin/service/control.html b/templates/admin/service/control.html new file mode 100644 index 00000000..2826333b --- /dev/null +++ b/templates/admin/service/control.html @@ -0,0 +1,70 @@ +{% extends 'base.html' %} +{% load static %} + +{% block scripts %} + + +{# selects #} + + + +{% endblock %} + +{% block body %} + +
{% csrf_token %} +
+ Управление услугой {{ object.name }} + +
+
+

+
+
+ {# event_type #} +
+ +
+ {{ form.event_type }} +
+
+ + {# region #} +
+ +
{{ form.region }} + {{ form.region.errors }} +
+
+ + {# country #} +
+ +
{{ form.country }} + {{ form.country.errors }} +
+
+ {# expositions #} +
+ +
{{ form.expositions }} + {{ form.expositions.errors }} +
+
+ {# conferences #} +
+ +
{{ form.conferences }} + {{ form.conferences.errors }} +
+
+ +
+
+
+
+{% endblock %} + +{% block bot_scripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/admin/service/control_list.html b/templates/admin/service/control_list.html new file mode 100644 index 00000000..38bf41b8 --- /dev/null +++ b/templates/admin/service/control_list.html @@ -0,0 +1,39 @@ +{% extends 'admin_list.html' %} + +{% block body %} +
+
+

Список услуг

+
+
+ + + + + + + + + + + {% for item in object_list %} + + + + + + + + + {% endfor %} + +
idНазвание 
{{ item.id }}{{ 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/settings/main_page.html b/templates/admin/settings/main_page.html index 5018c3f7..cd51e77f 100644 --- a/templates/admin/settings/main_page.html +++ b/templates/admin/settings/main_page.html @@ -89,48 +89,5 @@ {% endblock %} {% block bot_scripts %} - + {% endblock %} \ No newline at end of file diff --git a/templates/client/search/indexes/conference/conference_text.txt b/templates/client/search/indexes/conference/conference_text.txt index 297ca690..3f323f24 100644 --- a/templates/client/search/indexes/conference/conference_text.txt +++ b/templates/client/search/indexes/conference/conference_text.txt @@ -1,3 +1 @@ -{% for text in object.get_index_text %} - {{ text }} -{% endfor %} \ No newline at end of file +{{ object.get_index_text }} \ No newline at end of file