Linked service views and templates

remotes/origin/1203
Ivan Kovalkovskyi 10 years ago
parent d738fccd86
commit c09c058905
  1. 40
      service/admin.py
  2. 8
      service/admin_urls.py
  3. 27
      service/forms.py
  4. 1
      service/management/__init__.py
  5. 1
      service/management/commands/__init__.py
  6. 25
      service/management/commands/create_linked_services.py
  7. 24
      service/models.py
  8. 162
      templates/admin/service/linked_service.html
  9. 11
      templates/admin/service/linked_service_confirm_delete.html
  10. 48
      templates/admin/service/linked_service_list.html

@ -165,20 +165,21 @@ class ServiceAddView(FormView):
pass pass
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.generic import UpdateView from django.views.generic import UpdateView, ListView, DeleteView
from django.db.models import F from django.db.models import F
from django.db.models.query import EmptyQuerySet from django.core.urlresolvers import reverse
from .forms import LinkedServiceForm from .forms import LinkedServiceForm
from .models import LinkedService from .models import LinkedService
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference from conference.models import Conference
class ServiceUpdateView(UpdateView):
class LinkedServiceUpdateView(UpdateView):
form_class = LinkedServiceForm form_class = LinkedServiceForm
model = LinkedService model = LinkedService
template_name = "admin/service/linked_service.html" template_name = "admin/service/linked_service.html"
success_url = "/admin/service/all/" success_url = "/admin/service/test/all/"
def get_object(self, queryset=None): def get_object(self, queryset=None):
url = self.kwargs['url'] url = self.kwargs['url']
@ -187,8 +188,35 @@ class ServiceUpdateView(UpdateView):
return obj return obj
def get_initial(self): def get_initial(self):
types = {0:[], 1:['expo'], 2:['conference'], 3:['expo', 'conference']}
initial = { initial = {
'expositions':','.join(["%s:%s"%(item.id, item.name) for item in object.expositions.all()]), 'expositions': ",".join("%s:%s"%(item.id, item.name) for item in self.object.expositions.all()),
'conferences':','.join(["%s:%s"%(item.id, item.name) for item in self.object.conferences.all()]) 'conferences': ",".join("%s:%s"%(item.id, item.name) for item in self.object.conferences.all()),
'type': types[self.object.service.type.mask]
} }
return initial
def get_success_url(self):
return self.success_url
def form_valid(self, form):
self.object = form.save()
self.object.update_all_flags()
return HttpResponseRedirect(self.get_success_url())
class LinkedServiceList(ListView):
model = LinkedService
template_name = 'admin/service/linked_service_list.html'
class LinkedServiceDeleteView(DeleteView):
model = LinkedService
template_name = 'admin/service/linked_service_confirm_delete.html'
success_url = '/admin/service/test/all'
slug_url_kwarg = 'url'
def get_object(self, queryset=None):
url = self.kwargs['url']
service = get_object_or_404(Service, url=url)
obj = LinkedService.objects.get(service=service)
return obj

@ -2,7 +2,7 @@
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \ from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \
ParticipationListView, RemoteListView,TicketsListView ParticipationListView, RemoteListView,TicketsListView
from service.admin import ServiceControlList, ServiceControl, ServiceAddView, ServiceUpdateView from service.admin import ServiceControlList, ServiceControl, LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView
urlpatterns = patterns('service.admin', urlpatterns = patterns('service.admin',
url(r'^control/list/$', ServiceControlList.as_view()), url(r'^control/list/$', ServiceControlList.as_view()),
@ -18,8 +18,10 @@ urlpatterns = patterns('service.admin',
url(r'order/participation/$', ParticipationListView.as_view()), url(r'order/participation/$', ParticipationListView.as_view()),
url(r'order/remote/$', RemoteListView.as_view()), url(r'order/remote/$', RemoteListView.as_view()),
url(r'order/tickets/$', TicketsListView.as_view()), url(r'order/tickets/$', TicketsListView.as_view()),
url('^test/(?P<url>[a-z]*)/', ServiceUpdateView.as_view()), url('^test/delete/(?P<url>[a-z]*)/', LinkedServiceDeleteView.as_view(), name='linked_service_delete'),
url('^test/$', ServiceAddView.as_view()), url('^test/all/', LinkedServiceList.as_view(), name = 'linked_service_all'),
url('^test/(?P<url>[a-z]*)/', LinkedServiceUpdateView.as_view(), name= 'linked_service_update'),
#ajax #ajax
url(r'^get_city/$', 'get_city'), url(r'^get_city/$', 'get_city'),

@ -162,25 +162,36 @@ from django.db.models.query import EmptyQuerySet
class LinkedServiceForm(forms.ModelForm): class LinkedServiceForm(forms.ModelForm):
type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple) type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False)
expositions = forms.CharField(widget=forms.HiddenInput,required=False)
conferences = forms.CharField(widget=forms.HiddenInput, required=False)
class Meta: class Meta:
model = LinkedService model = LinkedService
fields = ['countries', 'all_countries', 'expositions', 'conferences'] fields = ['countries', 'all_countries', 'expositions', 'conferences']
widgets={
'expositions': forms.HiddenInput, def clean_countries(self):
'conferences': forms.HiddenInput return list(set(self.cleaned_data['countries']))
}
def clean_expositions(self): def clean_expositions(self):
expositions = EmptyQuerySet() expositions = EmptyQuerySet()
if self.cleaned_data['expositions']: if self.cleaned_data['expositions']:
expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions']))) expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions'].split(','))))
return expositions return expositions
def clean_conferences(self): def clean_conferences(self):
conferences = EmptyQuerySet() conferences = EmptyQuerySet()
if self.cleaned_data['conferences']: if self.cleaned_data['conferences']:
conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences']))) conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences'].split(','))))
return conferences return conferences
def save(self, commit=True):
obj = super(LinkedServiceForm, self).save(commit=True)
data = self.cleaned_data
# manage service type bit field
types = data['type']
obj.service.type = 0
for type in types:
obj.service.type = obj.service.type | getattr(Service.type, type)
obj.service.save()
return obj

@ -0,0 +1 @@
__author__ = 'dev'

@ -0,0 +1,25 @@
from django.core.management.base import BaseCommand
from django.utils.translation import activate
from service.models import Service,LinkedService
from country.models import Country
from exposition.models import Exposition
from conference.models import Conference
class Command(BaseCommand):
def handle(self, *args, **options):
activate('ru')
LinkedService.objects.all().delete()
services = Service.objects.all()
for service in services:
linked = LinkedService()
linked.service = service
linked.save()
if Country.objects.language().filter(services=getattr(Country.services, service.url)).count() == Country.objects.language().count():
linked.all_countries = True
else:
linked.countries = Country.objects.language().filter(services=getattr(Country.services, service.url))
linked.expositions = Exposition.objects.language().filter(services=getattr(Exposition.services, service.url))
linked.conferences = Conference.objects.language().filter(services=getattr(Conference.services, service.url))
linked.save()

@ -204,6 +204,7 @@ class CallBack(models.Model):
from country.models import Country from country.models import Country
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference from conference.models import Conference
from django.db.models import F
class LinkedService(models.Model): class LinkedService(models.Model):
@ -212,3 +213,26 @@ class LinkedService(models.Model):
all_countries = models.BooleanField(default=False) all_countries = models.BooleanField(default=False)
expositions = models.ManyToManyField(Exposition, blank=True) expositions = models.ManyToManyField(Exposition, blank=True)
conferences = models.ManyToManyField(Conference, blank=True) conferences = models.ManyToManyField(Conference, blank=True)
def update_countries_flag(self):
if self.all_countries:
Country.objects.language().update(services=F('services').bitor(getattr(Country.services, self.service.url)))
else:
self.countries.update(services=F('services').bitor(getattr(Country.services, self.service.url)))
Country.objects.exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url)))
def update_expositions_flag(self):
self.expositions.update(services=F('services').bitor(getattr(Exposition.services, self.service.url)))
Exposition.objects.exclude(id__in=[c.id for c in self.expositions.all()]).update(services=F('services').bitand(~getattr(Exposition.services, self.service.url)))
def update_conferences_flag(self):
self.conferences.update(services=F('services').bitor(getattr(Conference.services, self.service.url)))
Conference.objects.exclude(id__in=[c.id for c in self.conferences.all()]).update(services=F('services').bitand(~getattr(Conference.services, self.service.url)))
def update_all_flags(self):
self.update_countries_flag()
self.update_expositions_flag()
self.update_conferences_flag()
def __unicode__(self):
return u'Linked service for %s'%self.service.url

@ -0,0 +1,162 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<style >
ul{
list-style: none;
}
</style>
<script src="{% static 'js/select/select2.js' %}"></script>
<script>
$(document).ready(function () {
console.log(1);
$('#id_expositions').select2({
placeholder: "Expositions",
width: 'element',
multiple: true,
ajax: {
url: "/admin/exposition/search/",
dataType: "json",
quietMillis: 200,
multiple: true,
data: function (term, page) {
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 = [];
var values = element.val();
element.val("");
$(values.split(",")).each(function (i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
console.log("initselection data: " );
console.log( data);
callback(data);
}
});
$('#id_conferences').select2({
placeholder: "Conferences",
width: 'element',
multiple: true,
ajax: {
url: "/admin/conference/search/",
dataType: "json",
quietMillis: 200,
multiple: true,
data: function (term, page) {
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 = [];
var values = element.val();
element.val("");
$(values.split(",")).each(function (i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
});
</script>
{% endblock %}
{% block body %}
{# Uses multilang.html template for translated fields #}
<form class="form-horizontal" method="post" action="" >{% csrf_token %}
{{ form.errors }}
<div class="form-group">
<label class="col-sm-2 control-label">Type:</label>
<div id = 'types' class="col-sm-10">
{{ form.type }}{{ form.type.errors }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Countries:</label>
<div class="col-sm-10">
{{ form.countries }}{{ form.countries.errors }}
</div>
</div>
<div class="row">
<label class="col-sm-4 control-label">All:</label>
<div class="col-sm-8">
{{ form.all_countries }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Expos:</label>
<div class="col-sm-10">
{{ form.expositions }}{{ form.expositions.errors }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Conferences:</label>
<div class="col-sm-10">
{{ form.conferences }}{{ form.conferences.errors }}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-6 col-sm-4">
<button type="submit" class="btn btn-default">Submit</button>
<button type="reset" class="btn">Reset</button>
</div>
</div>
</form>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить настройку для сервиса "{{ object.service.name }}" ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'linked_service_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,48 @@
{% 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>id</th>
<th>Название услуги</th>
<th>Тип</th>
<th>Стран</th>
<th>Виставок</th>
<th>Конференций</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{{ object }}
{% for item in object_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.service.name }}</td>
<td>{% if item.service.type.mask == 1 %} expo {% elif item.service.type.mask == 2%} conf {% elif item.service.type.mask == 3 %} expo, conf{% endif %}</td>
<td>{{ item.countries.count }}</td>
<td>{{ item.expositions.count }}</td>
<td>{{ item.conferences.count }}</td>
<td class="center sorting_1">
<a class="btn btn-info" href="{% url 'linked_service_update' item.service.url %}">
<i class="icon-edit icon-white"></i> Изменить
</a>
<a class="btn btn-danger" href="{% url 'linked_service_delete' item.service.url %}">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
Loading…
Cancel
Save