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
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.query import EmptyQuerySet
from django.core.urlresolvers import reverse
from .forms import LinkedServiceForm
from .models import LinkedService
from exposition.models import Exposition
from conference.models import Conference
class ServiceUpdateView(UpdateView):
class LinkedServiceUpdateView(UpdateView):
form_class = LinkedServiceForm
model = LinkedService
template_name = "admin/service/linked_service.html"
success_url = "/admin/service/all/"
success_url = "/admin/service/test/all/"
def get_object(self, queryset=None):
url = self.kwargs['url']
@ -187,8 +188,35 @@ class ServiceUpdateView(UpdateView):
return obj
def get_initial(self):
types = {0:[], 1:['expo'], 2:['conference'], 3:['expo', 'conference']}
initial = {
'expositions':','.join(["%s:%s"%(item.id, item.name) for item in object.expositions.all()]),
'conferences':','.join(["%s:%s"%(item.id, item.name) for item in self.object.conferences.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()),
'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 views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \
ParticipationListView, RemoteListView,TicketsListView
from service.admin import ServiceControlList, ServiceControl, ServiceAddView, ServiceUpdateView
from service.admin import ServiceControlList, ServiceControl, LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView
urlpatterns = patterns('service.admin',
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/remote/$', RemoteListView.as_view()),
url(r'order/tickets/$', TicketsListView.as_view()),
url('^test/(?P<url>[a-z]*)/', ServiceUpdateView.as_view()),
url('^test/$', ServiceAddView.as_view()),
url('^test/delete/(?P<url>[a-z]*)/', LinkedServiceDeleteView.as_view(), name='linked_service_delete'),
url('^test/all/', LinkedServiceList.as_view(), name = 'linked_service_all'),
url('^test/(?P<url>[a-z]*)/', LinkedServiceUpdateView.as_view(), name= 'linked_service_update'),
#ajax
url(r'^get_city/$', 'get_city'),

@ -162,25 +162,36 @@ from django.db.models.query import EmptyQuerySet
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:
model = LinkedService
fields = ['countries', 'all_countries', 'expositions', 'conferences']
widgets={
'expositions': forms.HiddenInput,
'conferences': forms.HiddenInput
}
def clean_countries(self):
return list(set(self.cleaned_data['countries']))
def clean_expositions(self):
expositions = EmptyQuerySet()
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
def clean_conferences(self):
conferences = EmptyQuerySet()
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
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 exposition.models import Exposition
from conference.models import Conference
from django.db.models import F
class LinkedService(models.Model):
@ -212,3 +213,26 @@ class LinkedService(models.Model):
all_countries = models.BooleanField(default=False)
expositions = models.ManyToManyField(Exposition, 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