diff --git a/Makefile b/Makefile index f622132d..772dc2a0 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ compilemessages: -@ipython manage.py compilemessages collectstatic: - @ipython manage.py collectstatic --noinput + @ipython manage.py collectstatic user: -@ipython manage.py createsuperuser diff --git a/apps/accounts/admin.py b/apps/accounts/admin.py index da600922..0c3e3456 100644 --- a/apps/accounts/admin.py +++ b/apps/accounts/admin.py @@ -20,8 +20,6 @@ from django.views.generic import DeleteView, TemplateView, UpdateView from django.views.generic.dates import DateMixin, MonthMixin, YearMixin from forms import ( ChangePasswordForm, - EmailAnnouncementForm, - UserCreationForm, UserFilterForm, UserForm ) @@ -55,13 +53,6 @@ class UserListView(AdminListView): return context -class EditUser(UpdateView): - model = User - form_class = UserForm - success_url = '/admin/accounts/all' - template_name = 'user_change.html' - - def user_change(request, url): """ Return form of user and post it on the server. @@ -116,47 +107,6 @@ def user_change(request, url): return render_to_response('user_change.html', context) -def create_admin(request): - if request.POST: - form = UserCreationForm(request.POST) - if form.is_valid(): - user = form.save(commit=False) - user.is_admin = False - user.save() - return HttpResponseRedirect('/admin/accounts/all') - - else: - form = UserCreationForm() - - args = {} - args.update(csrf(request)) - args['form'] = form - - return render_to_response('create_admin.html', args) - -def create_md5(request): - if request.POST: - form = UserCreationForm(request.POST) - if form.is_valid(): - user = User() - user.email = request.POST['email'] - user.first_name = request.POST['first_name'] - user.last_name = request.POST['last_name'] - user.password = md5(request.POST['password2']).hexdigest() - user.is_admin = True - user.save() - - return HttpResponseRedirect('/admin/accounts/all') - - else: - form = UserCreationForm() - - args = {} - args.update(csrf(request)) - args['form'] = form - - return render_to_response('create_admin.html', args) - def generatePassword(): """ diff --git a/apps/accounts/admin_urls.py b/apps/accounts/admin_urls.py index 6a381787..527d49ea 100644 --- a/apps/accounts/admin_urls.py +++ b/apps/accounts/admin_urls.py @@ -3,7 +3,7 @@ from django.conf.urls import patterns, url from django.core.urlresolvers import reverse_lazy from functions.custom_views import SimpleObjectChangeView -from .admin import AccountsStatistic, DeleteAccount, EditUser, UserListView +from .admin import AccountsStatistic, DeleteAccount, UserListView from .models import User attrs = { diff --git a/apps/accounts/forms.py b/apps/accounts/forms.py index 43cfa1a7..fe0575f6 100644 --- a/apps/accounts/forms.py +++ b/apps/accounts/forms.py @@ -29,43 +29,6 @@ def clean_relation_field(inst, field_name, model): return None -class UserCreationForm(forms.ModelForm): - password1 = forms.CharField(label=_(u'Пароль'), widget=forms.PasswordInput(render_value=False)) - password2 = forms.CharField(label=_(u'Повторите пароль'), widget=forms.PasswordInput(render_value=False)) - - class Meta: - model = User - fields = ('email', 'first_name', 'last_name') - - def clean_email(self): - """ - checking if user already exist - """ - email = self.cleaned_data.get('email') - try: - User.objects.get(email=email) - except User.DoesNotExist: - return email - raise forms.ValidationError(_(u'Пользователь с таким email уже существует')) - - def clean_password2(self): - password1 = self.cleaned_data.get('password1') - password2 = self.cleaned_data.get('password2') - - if password1 and password2 and password1 != password2: - raise forms.ValidationError(_(u'Пароли не совпадают')) - return password2 - - def save(self, commit=True): - user = super(UserCreationForm, self).save(commit=False) - user.set_password(self.cleaned_data['password2']) - - if commit: - user.save() - - return user - - class UserForm(forms.ModelForm): # email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False) country = forms.ChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.language().all()], @@ -196,14 +159,6 @@ class ChangePasswordForm(forms.Form): return data -class EmailAnnouncementForm(forms.Form): - data = [(1, _(u'Получать приглашения, сообщения и другую корреспонденцию от пользователей Expomap')), - (2, _(u'Получать обзор событий')), - (3, _(u'Получать новости'))] - announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple()) - - - url_regex = re.compile('^\w*$') class RegistrationCompleteForm(forms.ModelForm): country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(), diff --git a/apps/accounts/models.py b/apps/accounts/models.py index 983a98f5..96b79a3a 100644 --- a/apps/accounts/models.py +++ b/apps/accounts/models.py @@ -11,6 +11,7 @@ from django.db.models.loading import get_model from django.db.models.signals import post_save from django.utils import timezone from django.utils.translation import ugettext as _ + from functions.form_check import translit_with_separator from functions.model_mixin import GetURLorPK @@ -140,16 +141,12 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK): log = UserLog.objects.filter(user_id=self.pk)[0] return log - def get_full_name(self): """ Returns the first_name plus the last_name, with a space in between. """ return u'%s %s'%(self.first_name, self.last_name) - def set_url(self, st): - self.url = translit_with_separator(u'%s'%st) - def __unicode__(self): return self.email @@ -166,9 +163,6 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK): def has_perm(self, perm, obj=None): return True - def has_module_perms(self, app_label): - return True - def get_expositions_number(self): # 1 query return self.exposition_users.all().count() @@ -181,15 +175,6 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK): # 1 query return self.seminar_users.all().count() - def get_webinars_number(self): - # 1 query - return self.webinar_users.all().count() - - def get_events_number(self): - # 4 query - n = self.get_expositions_number() + self.get_conferences_number() + self.get_seminars_number() + self.get_webinars_number() - return n - def get_permanent_url(self): if self.url: return '/%s/' % self.url diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py index eeaf3696..51a6a553 100644 --- a/apps/accounts/urls.py +++ b/apps/accounts/urls.py @@ -9,7 +9,6 @@ from views import ( Feed, HomeView, MailingSettings, - # MailingSettingsUnsubscribe, NameView, PhoneView, ProfileCompanyView, @@ -21,8 +20,7 @@ from views import ( urlpatterns = patterns('', url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())), - url(r'^profile/mailing/$', MailingSettings.as_view(), name='accounts-mailing_settings'), - # url(r'^profile/mailing/unsubscribe/$', MailingSettingsUnsubscribe.as_view(), name='accounts-mailing_settings_unsubscribe'), + url(r'^profile/mailing/$', login_required(MailingSettings.as_view()), name='accounts-mailing_settings'), url(r'^profile/settings/$', login_required(SettingsView.as_view()), name='accounts_settings'), url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'), url(r'^profile/calendar/export/$', 'core.views.download_workbook'), diff --git a/apps/accounts/views.py b/apps/accounts/views.py index 65622297..bb4b735c 100644 --- a/apps/accounts/views.py +++ b/apps/accounts/views.py @@ -29,7 +29,7 @@ from company.edit_forms import NameForm as CompNameForm, HomeForm as CompHomeFor from emencia.django.newsletter.forms import SubscribeSettingsForm, MailingSettingsForm from emencia.django.newsletter.models import Contact, ContactSettings -from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm +from .forms import ChangePasswordForm, FeedFilterForm from .models import User from .edit_forms import AvatarForm, NameForm, HomeForm, WorkForm, AboutCompanyForm, PhoneForm, EmailForm,\ WebPageForm, SocialForm, AboutForm @@ -135,13 +135,11 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU 'checked_th': list(instance.themes.values_list('pk', flat=True)), 'contact': instance, }) - elif not self.request.user.is_authenticated(): - raise HttpResponseForbidden() - if self.request.GET.get('unsibscribe') and instance.subscriber: - instance.unsubscribe() - self.extra_ctx.update({'unsubscribe_success': True}) - elif not instance.subscriber: - self.extra_ctx.update({'unsubscribed': True}) + if self.request.GET.get('unsibscribe') and instance.subscriber: + instance.unsubscribe() + self.extra_ctx.update({'unsubscribe_success': True}) + elif not instance.subscriber: + self.extra_ctx.update({'unsubscribed': True}) return instance def form_valid(self, form): @@ -157,18 +155,6 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU # print(self.request.POST) return super(MailingSettings, self).form_invalid(form) -# -# class MailingSettingsUnsubscribe(GetUserMixin, RedirectView): -# url = reverse_lazy('accounts-mailing_settings') -# -# def get(self, request, *args, **kwargs): -# contact = self.get_user() -# if contact is None: -# return HttpResponseForbidden() -# if contact.subscriber: -# contact.unsubscribe() -# return super(MailingSettingsUnsubscribe, self).get(request, *args, **kwargs) - class CalendarView(TemplateView): """ diff --git a/apps/article/admin.py b/apps/article/admin.py index 18b67c93..d944a620 100644 --- a/apps/article/admin.py +++ b/apps/article/admin.py @@ -14,7 +14,7 @@ from ckeditor.widgets import CKEditorWidget from sorl.thumbnail.admin.current import AdminImageWidget #models and forms -from .forms import ArticleForm, ArticleDeleteForm, NewsForm +from .forms import NewsForm from .models import Article, Author from theme.models import Tag @@ -48,101 +48,6 @@ class ArticleDeleteView(DeleteView): return "/admin/article/%s/all/" % type -def article_all(request): - """ - Return list of all articles with pagination - """ - return objects_list(request, Article, 'article_all.html') - -@login_required -def article_copy(request, url): - - article = Article.objects.safe_get(slug=url) - if not article: - return HttpResponseRedirect(get_referer(request)) - else: - article.clone() - return HttpResponseRedirect(get_referer(request)) - - -def article_add(request): - """ - Return form of article and post it on the server. - - If form is posted redirect on the page of all articles. - """ - #get organiser from current user - init_data = {'author':request.user.organiser} - #choices field which will be filled by ajax - choices = {'tag': Tag} - return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all', - choices, init_data) - - -def article_delete(request, url): - return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all') - - -@login_required -def article_change(request, url): - """ - Return form and fill it with existing Article object data. - - If form is posted redirect on the page of all articles. - """ - try: - #check if article_id exists else redirect to the list of cities - article = Article.objects.get(slug=url) - file_form = FileModelForm(initial={'model': 'article.Article'}) - article_id = getattr(article, 'id') - except: - return HttpResponseRedirect('/admin/article/all') - - if request.POST: - form = ArticleForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - - if form.is_valid(): - form.save(getattr(article, 'id')) - return HttpResponseRedirect('/admin/article/all') - else: - data = {} - #fill form with data from database - data['author'] = article.author - data['theme'] = [item.id for item in article.theme.all()] - data['tag'] = [item.id for item in article.tag.all()] - #hidden field - data['article_id'] = article_id - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields - data['main_title_%s' % code] = obj.main_title - data['preview_%s' % code] = obj.preview - data['description_%s' % code] = obj.description - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #fill form - form = ArticleForm(initial=data) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - - #get list of files which connected with specific model object - args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id')) - args['obj_id'] = getattr(article, 'id') - - - return render_to_response('article_add.html', args) - #----------------------- from django.views.generic import FormView from functions.custom_views import ListView @@ -206,6 +111,7 @@ class BlogView(FormView): data['main_title_%s' % code] = obj.main_title data['preview_%s' % code] = obj.preview data['description_%s' % code] = obj.description + data['short_description_%s' % code] = obj.short_description data['title_%s' % code] = obj.title data['keywords_%s' % code] = obj.keywords data['descriptions_%s' % code] = obj.descriptions @@ -230,7 +136,7 @@ class BlogView(FormView): class NewsList(ListView): model = Article - template_name = 'article/article_admin_list.html' + template_name = 'c_admin/article/article_admin_list.html' paginate_by = 20 def get_queryset(self): @@ -247,17 +153,3 @@ class NewsView(BlogView): template_name = 'c_admin/article/blog_form.html' success_url = '/admin/article/news/all/' obj = None - - - - -""" -from django.views.generic import CreateView -from models import Blog -from forms import BlogForm - -class BlogCreate(CreateView): - model = Blog - form_class = BlogForm - template_name = 'c_admin/blog/blog_add.html' -""" diff --git a/apps/article/forms.py b/apps/article/forms.py index fc319bc2..1ff7478b 100644 --- a/apps/article/forms.py +++ b/apps/article/forms.py @@ -116,7 +116,6 @@ class BlogForm(_BlogForm): return article - class NewsForm(_BlogForm): type = Article.news exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) @@ -154,157 +153,6 @@ class NewsForm(_BlogForm): return None -class ArticleForm(forms.Form): - """ - Create Article form for creating conference - - __init__ uses for dynamic creates fields - - save function saves data in Article object. If it doesnt exist create new object - """ - #users that have organiser profile - author = forms.ModelChoiceField(label=_(u'Автор'),queryset=User.objects.exclude(organiser__isnull=True)) - - key = forms.CharField(required=False, widget=forms.HiddenInput()) - theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all()) - #creates select input with empty choices cause it will be filled with ajax - tag = forms.MultipleChoiceField(label=_(u'Теги'), required=False) - - article_id = forms.CharField(required=False, widget=forms.HiddenInput()) - - def __init__(self, *args, **kwargs): - """ - create dynamical translated fields fields - """ - super(ArticleForm, 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['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) - self.fields['preview_%s' % code] = forms.CharField(label=_(u'Превью'), required=required, widget=CKEditorWidget) - self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=required, widget=CKEditorWidget) - #meta data - self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - - def save(self, id=None): - """ - change Article object with id = id - N/A add new Article object - usage: form.save(obj) - if change article - form.save() - if add article - """ - data = self.cleaned_data - #create new Article object or get exists - if not id: - article = Article() - else: - article = Article.objects.get(id=id) - #clear manytomany relations - article.theme.clear() - article.tag.clear() - - - if data.get('author'): - article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset - - #create slug field from russian language - if not getattr(article, 'slug'): - article.slug = translit_with_separator(data['main_title_ru'].strip()).lower() - - # fill translated fields and save object - fill_with_signal(Article, article, data) - # fill manytomany fields - for item in data['theme']: - article.theme.add(item.id)#.id cause select uses queryset - - for item in data['tag']: - article.tag.add(item) - - article.save() - - #save files - check_tmp_files(article, data['key']) - - - def clean(self): - id = self.cleaned_data.get('article_id') - main_title_ru = self.cleaned_data.get('main_title_ru') - - article = Article.objects.filter(url=translit_with_separator(main_title_ru)) - if article and str(article[0].id) != id: - msg = _(u'Статья с таким названием уже существует') - self._errors['main_title_ru'] = ErrorList([msg]) - del self.cleaned_data['main_title_ru'] - - return self.cleaned_data - - -class ArticleDeleteForm(forms.ModelForm): - url = forms.CharField(widget=forms.HiddenInput()) - - class Meta: - model = Article - fields = ('url',) - -#---------------------------------- -""" -from models import Blog - -class BlogForm(forms.ModelForm): - class Meta: - model = Blog - exclude = ('created', 'modified', 'creator', 'theme', 'tag') - - def __init__(self, *args, **kwargs): - super(BlogForm, self).__init__(*args, **kwargs) - - - 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['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required) - self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget) - self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget) - #meta data - self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) -""" - - - -class ArticleFilterForm(forms.Form): - theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, - choices=[(item.id, item.name) for item in Theme.objects.language().distinct()]) - tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) - - ''' - - def __init__(self, *args, **kwargs): - """ - create dynamical translated fields fields - """ - super(ArticleFilterForm, self).__init__(*args, **kwargs) - ids = [item['theme_id'] for item in list(Article.objects.blogs().values('theme_id').distinct())] - self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, - choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)]) - ''' - - class BlogFilterForm(forms.Form): tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) diff --git a/apps/article/models.py b/apps/article/models.py index 36f5ccd9..3d21ea1c 100644 --- a/apps/article/models.py +++ b/apps/article/models.py @@ -107,21 +107,6 @@ class Article(TranslatableModel): def __unicode__(self): return self.lazy_translation_getter('main_title', self.pk) - def translation_model(self): - return self._meta.translations_model - - def publish(self): - """ - set publish date. uses when publish date is none - """ - self.in_sitemap = True - if not self.publish_date: - # save time only first time - self.publish_date = now() - self.save() - - return self - def get_event(self): """ get event connected to article @@ -137,17 +122,8 @@ class Article(TranslatableModel): # If no slug is provided, generates one before saving. if not self.slug: self.slug = self.generate_unique_slug() - # Set the description field on save. - # if self.gen_description: - # self.description = strip_tags(self.description_from_content()) super(Article, self).save(*args, **kwargs) - def description_from_content(self): - """ - """ - # place for logic - return '' - def generate_unique_slug(self): """ Create a unique slug by passing the result of get_slug() to @@ -173,37 +149,6 @@ class Article(TranslatableModel): """ return u'%s' % self.lazy_translation_getter('main_title', self.pk) - def _get_next_or_previous_by_publish_date(self, is_next, **kwargs): - """ - Retrieves next or previous object by publish date. We implement - our own version instead of Django's so we can hook into the - published manager and concrete subclasses. - """ - arg = "publish_date__gt" if is_next else "publish_date__lt" - order = "publish_date" if is_next else "-publish_date" - lookup = {arg: self.publish_date} - concrete_model = base_concrete_model(Article, self) - try: - queryset = concrete_model.objects.published - except AttributeError: - queryset = concrete_model.objects.all - try: - return queryset(**kwargs).filter(**lookup).order_by(order)[0] - except IndexError: - pass - - def get_next_by_publish_date(self, **kwargs): - """ - Retrieves next object by publish date. - """ - return self._get_next_or_previous_by_publish_date(True, **kwargs) - - def get_previous_by_publish_date(self, **kwargs): - """ - Retrieves previous object by publish date. - """ - return self._get_next_or_previous_by_publish_date(False, **kwargs) - def admin_url(self): """ returns url for admin pages diff --git a/apps/city/admin.py b/apps/city/admin.py index 34a05fc7..fc5edef7 100644 --- a/apps/city/admin.py +++ b/apps/city/admin.py @@ -21,13 +21,6 @@ from functions.admin_views import AdminListView from functions.http import JsonResponse -def city_all(request): - """ - return list of all cities with pagination - """ - return objects_list(request, City, 'city_all.html') - - def city_add(request): """ Return form of city and post it on the server. @@ -35,6 +28,7 @@ def city_add(request): """ return add_object_with_file(request, CityForm, 'city_add.html', '/admin/city/all') + def city_delete(request, url): return delete_object(request, City, CityDeleteForm, url, '/admin/city/all/') diff --git a/apps/city/urls.py b/apps/city/urls.py index 2496e422..12aa719d 100644 --- a/apps/city/urls.py +++ b/apps/city/urls.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, url -from views import CityView urlpatterns = patterns('', url(r'get-city/', 'city.views.get_city'), - # commented for good times - #url(r'(?P.*)', CityView.as_view()), ) diff --git a/apps/city/views.py b/apps/city/views.py index 0cf49417..9143c18c 100644 --- a/apps/city/views.py +++ b/apps/city/views.py @@ -7,15 +7,6 @@ from models import City from settings.views import get_by_lang -class CityView(DetailView): - """ - this view is not used yet - """ - model = City - slug_field = 'url' - template_name = 'client/city/city.html' - - def get_city(request): """ returns filtered cities in current language in json format @@ -39,4 +30,4 @@ def get_city(request): return HttpResponse(json.dumps(result, indent=4), content_type='application/json') else: - return HttpResponse('not ajax') \ No newline at end of file + return HttpResponse('not ajax') diff --git a/apps/company/admin.py b/apps/company/admin.py index 0b0c6598..a6ff6751 100644 --- a/apps/company/admin.py +++ b/apps/company/admin.py @@ -19,23 +19,6 @@ from theme.models import Tag from django.utils.translation import ugettext_lazy as _ -def company_all(request): - """ - Return list of all companies with pagination - """ - return objects_list(request, Company, 'company_all.html') - - -def company_add(request): - """ - Return form of company and post it on the server. - If form is posted redirect on the page of all companies. - """ - return add_object_with_file(request, CompanyForm, - 'company_add.html', '/admin/company/all/', - {'city': City, 'tag': Tag}) - - def company_delete(request, url): return delete_object(request, Company, CompanyDeleteForm, url, '/admin/company/all') diff --git a/apps/company/admin_urls.py b/apps/company/admin_urls.py index d42275f0..10340bf1 100644 --- a/apps/company/admin_urls.py +++ b/apps/company/admin_urls.py @@ -27,11 +27,4 @@ urlpatterns = patterns('company.admin', url(r'^(?P.*)/$', CompanyView.as_view()), url(r'^$', CompanyView.as_view()), - - # url(r'^add.*/$', 'company_add'), - # url(r'^delete/(?P.*)/$', 'company_delete'), - # url(r'^change/(?P.*)/$', 'company_change'), - # url(r'^all/$', 'company_all'), - # url(r'^all/$', CompanyListView.as_view()), - ) diff --git a/apps/company/signals.py b/apps/company/signals.py deleted file mode 100644 index 9c1a669c..00000000 --- a/apps/company/signals.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from django.db.models.signals import post_save -from models import Company -from functions.signal_handlers import post_save_handler - -#post_save.connect(post_save_handler, sender=Company) diff --git a/apps/core/forms.py b/apps/core/forms.py index fe61cd31..1836f4eb 100644 --- a/apps/core/forms.py +++ b/apps/core/forms.py @@ -10,48 +10,6 @@ from haystack.query import SearchQuerySet, EmptySearchQuerySet from hvad.forms import TranslatableModelForm from models import Page - -class PlaceSearchForm(forms.Form): - q = forms.CharField(label=_(u'Поиск'), required=False) - w = forms.CharField(label=_(u'Где'), required=False) - - def search(self): - q = self.cleaned_data.get('q') - w = self.cleaned_data.get('w') - - if not q and not w: - return EmptySearchQuerySet() - - sqs = SearchQuerySet().models(PlaceExposition, PlaceConference) - - if q: - sqs = sqs.auto_query(q) - if w: - sqs = sqs.filter(where__contains=w) - - return sqs - -class CallbackForm(forms.Form): - callback_phone = forms.CharField() - - def clean_callback_phone(self): - phone = self.cleaned_data['callback_phone'] - phone_str = self.cleaned_data['callback_phone'] - deduct = ('-','(',')','.',' ') - for elem in deduct: - phone = phone.replace(elem, '') - if phone.isdigit(): - return phone_str - else: - raise forms.ValidationError(_(u'Введите правильный телефон')) - - def send(self): - phone = self.cleaned_data['callback_phone'] - send_mail(phone, phone, None, [settings.CALLBACK_EMAIL]) - - -# ------------------ Page Form ----------------------- - from django.conf import settings from django.forms import Textarea from ckeditor.widgets import CKEditorWidget diff --git a/apps/core/simple_index_view.py b/apps/core/simple_index_view.py index d5de62ab..b434d43a 100644 --- a/apps/core/simple_index_view.py +++ b/apps/core/simple_index_view.py @@ -13,11 +13,11 @@ from settings.models import LandingComment, ParticipationComment class AdvertisingView(MetadataMixin, TemplateView): - template_name = 'simple_pages/advertising.html' + template_name = 'client/simple_pages/advertising.html' class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView): - template_name = 'simple_pages/advertising_landing.html' + template_name = 'client/simple_pages/advertising_landing.html' def get_context_data(self, **kwargs): context = super(AdvertisingViewLanding, self).get_context_data(**kwargs) @@ -26,7 +26,7 @@ class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView): class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView): - template_name = 'simple_pages/participation_landing.html' + template_name = 'client/simple_pages/participation_landing.html' form_class = ParticipationLandingForm def get_initial(self): @@ -61,7 +61,7 @@ class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView): class AboutView(MetadataMixin, TemplateView): - template_name = 'simple_pages/about.html' + template_name = 'client/simple_pages/about.html' def callback(request): diff --git a/apps/core/utils.py b/apps/core/utils.py index 1ae82b4c..de6edb26 100644 --- a/apps/core/utils.py +++ b/apps/core/utils.py @@ -33,33 +33,6 @@ CELL_STYLE_MAP = ( ) -def multi_getattr(obj, attr, default=None): - attributes = attr.split(".") - for i in attributes: - try: - obj = getattr(obj, i) - except AttributeError: - if default: - return default - else: - return '-' - return obj - - -def get_column_cell(obj, name): - try: - attr = multi_getattr(obj, name) - except ObjectDoesNotExist: - return '' - if hasattr(attr, '_meta'): - # A Django Model (related object) - return unicode(attr).strip() - elif hasattr(attr, 'all'): - # A Django queryset (ManyRelatedManager) - return ', '.join(unicode(x).strip() for x in attr.all()) - return attr - - def queryset_to_workbook(queryset, columns, report_date = None): # localization diff --git a/apps/core/views.py b/apps/core/views.py index 277067c9..f2d2356a 100644 --- a/apps/core/views.py +++ b/apps/core/views.py @@ -9,136 +9,6 @@ from django.core.urlresolvers import reverse_lazy from functions.views_help import split_params from django.utils.translation import ugettext as _ - -class PlaceListView(ListView): - paginate_by = 10 - params = None - single_page = False - template_name = 'place_catalog_test.html' - model = 'places' - order = 'data_begin' - - def get_params(self): - model_names = {'places': _(u'Места')} - model_alternative_name = {'places': 'place'} - params = [{'type':'model', 'url':self.model, 'name': model_names.get(self.model), - 'alternative_name': model_alternative_name.get(self.model)}] - - st = self.kwargs.get('params') - if st: - params = params + split_params(st) - - return params - - def get_queryset(self): - pl_ex = PlaceExposition.objects.all() - pl_conf = PlaceConference.objects.all() - - params = self.get_params() - for param in params: - - if param.get('type') == 'country': - country = Country.objects.safe_get(url=param.get('url')) - if country: - param['name'] = country.name - pl_ex = pl_ex.filter(country=country) - pl_conf = pl_conf.filter(country=country) - if param.get('type') == 'city': - city = City.objects.safe_get(url=param.get('url')) - if city: - param['name'] = city.name - pl_ex = pl_ex.filter(city=city) - pl_conf = pl_conf.filter(city=city) - - if param.get('type') == 'place': - pl_ex = pl_ex.filter(url=param.get('url')) - if pl_ex: - query = pl_ex - else: - query = pl_conf.filter(url=param.get('url')) - - self.single_page = True - - if query: - param['name'] = query[0].name - - #if self.request: - # views = query[0].views - # query.update(views=views+1) - self.params = params - return query - - self.params = params - return list(pl_ex) + list(pl_conf) - - - def get_context_data(self, **kwargs): - context = super(PlaceListView, self).get_context_data(**kwargs) - context['filter'] = self.params - context['single_page'] = self.single_page - context['search_form'] = self.search_form - context['search_action'] = '/places/search/' - context['type'] = 'places search' - return context - -class PlacePhotoView(PlaceListView): - paginate_by = 12 - template_name = 'place/place_photo.html' - obj = None - - def get_queryset(self): - pl_ex = PlaceExposition.objects.all() - pl_conf = PlaceConference.objects.all() - - params = self.get_params() - for param in params: - - if param.get('type') == 'country': - country = Country.objects.safe_get(url=param.get('url')) - if country: - param['name'] = country.name - pl_ex = pl_ex.filter(country=country) - pl_conf = pl_conf.filter(country=country) - if param.get('type') == 'city': - city = City.objects.safe_get(url=param.get('url')) - if city: - param['name'] = city.name - pl_ex = pl_ex.filter(city=city) - pl_conf = pl_conf.filter(city=city) - - if param.get('type') == 'place': - pl_ex = pl_ex.filter(url=param.get('url')) - if pl_ex: - query = pl_ex - else: - query = pl_conf.filter(url=param.get('url')) - - self.single_page = True - - if query: - param['name'] = query[0].name - - #if self.request: - # views = query[0].views - # query.update(views=views+1) - - params.append({'type':'photo', 'name':_(u'Фото')}) - self.params = params - self.obj = query[0] - - return query[0].photogallery.photos.all() - - self.params = params - return list(pl_ex) + list(pl_conf) - - def get_context_data(self, **kwargs): - context = super(PlacePhotoView, self).get_context_data(**kwargs) - context['object'] = self.obj - return context - - -# --------------------- Page views ------------------------ - from forms import PageForm from models import Page diff --git a/apps/expobanner/admin.py b/apps/expobanner/admin.py index b7b2124d..33266cac 100644 --- a/apps/expobanner/admin.py +++ b/apps/expobanner/admin.py @@ -125,14 +125,9 @@ class BannerList(AbstractList): class LinkList(AbstractList): - model = Banner verbose = _(u'Список ссылок') template_name = 'c_admin/expobanner/link_list.html' - - def get_queryset(self): - qs = super(LinkList, self).get_queryset() - qs = qs.filter(link=True).order_by('-created_at') - return qs + queryset = Banner.objects.filter(link=True).order_by('-created_at') class CustomerList(AbstractList): diff --git a/apps/meta/admin.py b/apps/meta/admin.py index 20c0f236..bc47f4ef 100644 --- a/apps/meta/admin.py +++ b/apps/meta/admin.py @@ -13,6 +13,7 @@ class MetaListView(AdminListView): form_class = MetaFilterForm model = MetaSetting + class MetaView(AdminView): form_class = MetaForm model = MetaSetting diff --git a/apps/meta/forms.py b/apps/meta/forms.py index 67fb7be2..00b9dcca 100644 --- a/apps/meta/forms.py +++ b/apps/meta/forms.py @@ -48,8 +48,31 @@ class MetaForm(forms.Form): meta.save() -class MetaFilterForm(AdminFilterForm): +class MetaFilterForm(forms.Form): model = MetaSetting + exact_name = forms.CharField(label=_(u'Название'), required=False) + name = forms.CharField(label=_(u'Часть названия'), required=False) + + def filter(self): + """ + + return filtered queryset + form must be cleaned before calling this method + + """ + model = self.model + data = self.cleaned_data + name = data['name'] + exact_name = data['exact_name'] + if exact_name: + qs = model.objects.filter(translations__title=name).distinct() + return qs + + qs = model.objects.all() + if name: + qs = qs.filter(translations__title__icontains=name).distinct() + + return qs class SeoTextForm(TranslatableModelForm): diff --git a/apps/place_conference/models.py b/apps/place_conference/models.py index 532c2461..1ebb4ee4 100644 --- a/apps/place_conference/models.py +++ b/apps/place_conference/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.contenttypes import generic from django.db.models.signals import post_save, pre_save +from django.utils import timezone from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from functions.custom_fields import EnumField from functions.custom_fields import LocationField @@ -107,8 +108,8 @@ class PlaceConference(TranslatableModel, ExpoMixin): return '/places' def get_events_number(self): - exp = Conference.objects.filter(place=self) - return len(exp) + return Conference.objects.filter(place=self, + data_begin__gt=timezone.now()).count() def events(self): events = Conference.objects.filter(place=self)[:6] diff --git a/apps/place_exposition/models.py b/apps/place_exposition/models.py index 24f3a533..9632908c 100644 --- a/apps/place_exposition/models.py +++ b/apps/place_exposition/models.py @@ -4,6 +4,7 @@ from django.db.models import Q from django.contrib.contenttypes import generic from django.db.models.signals import post_save, pre_save from django.utils.translation import ugettext as _ +from django.utils import timezone from functools import partial from django.conf import settings from django.core.urlresolvers import reverse @@ -255,8 +256,8 @@ class PlaceExposition(TranslatableModel, ExpoMixin): return duplicate def get_events_number(self): - exp = Exposition.objects.filter(place=self) - return len(exp) + return Exposition.objects.filter(place=self, + data_begin__gt=timezone.now()).count() class Hall(TranslatableModel): diff --git a/apps/place_exposition/urls.py b/apps/place_exposition/urls.py index 5ee78d27..e3fe1120 100644 --- a/apps/place_exposition/urls.py +++ b/apps/place_exposition/urls.py @@ -45,6 +45,7 @@ urlpatterns = patterns( url( r'^(?P.*)/expositions/$', PlaceExpositionListView.as_view(), + {'meta_id': 94}, name='place_exposition_list' ), url( diff --git a/apps/place_exposition/views.py b/apps/place_exposition/views.py index 286c3262..d438c3c3 100644 --- a/apps/place_exposition/views.py +++ b/apps/place_exposition/views.py @@ -10,11 +10,12 @@ from django.template import RequestContext from django.utils import translation from django.utils.translation import ugettext as _ from django.views.generic import DetailView, FormView +from django.utils import timezone from functions.cache_mixin import CacheMixin, JitterCacheMixin from functions.custom_views import ListView from meta.views import MetadataMixin from place_conference.models import PlaceConference - +from exposition.models import Exposition from .models import PlaceExposition @@ -131,15 +132,12 @@ class PlaceList(JitterCacheMixin, MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION template_name = 'client/place/place_list.html' - def get_queryset(self): - #qs = super(PlaceList, self).get_queryset().order_by('-rating') - qs= PlaceExposition.objects.language().select_related('country', 'city').all().order_by('-rating') - conf_qs = PlaceConference.objects.language().all() + qs = PlaceExposition.objects.language().select_related('country', 'city').order_by('-rating') + conf_qs = PlaceConference.objects.language().select_related('country', 'city') return list(qs)+list(conf_qs) - class PlaceCatalogBy(JitterCacheMixin, MetadataMixin, ListView): cache_range = [60*30, 60*60] template_name = 'client/place/catalog_by.html' @@ -232,20 +230,28 @@ class PlaceCityCatalog(PlaceCatalog): return context -class PlaceExpositionListView(ListView): +class PlaceExpositionListView(MetadataMixin, ListView): """ Представление перечня событий относительно места. Переход на эту страницу происходит со страницы подробного просмотра места, по ссылке "Все события" """ template_name = 'client/place/place_exposition_list.html' + # cache_range = settings.CACHE_RANGE def get_object(self): slug = self.kwargs.get('slug') - return get_object_or_404(PlaceExposition, url=slug) + self.object = get_object_or_404(PlaceExposition, url=slug) + return self.object def get_queryset(self): - return self.get_object().exposition_place.all() + return Exposition.objects.filter( + place=self.get_object(), data_begin__gte=timezone.now() + ).select_related( + 'country', 'city' + ).prefetch_related( + 'tag' + ) def get_context_data(self, **kwargs): ctx = super(PlaceExpositionListView, self).get_context_data(**kwargs) diff --git a/apps/theme/admin.py b/apps/theme/admin.py index f8c4b1f1..68ab8378 100644 --- a/apps/theme/admin.py +++ b/apps/theme/admin.py @@ -95,9 +95,6 @@ def theme_change(request, theme_id=None): data['name_%s'%code] = obj.name data['description_%s'%code] = obj.description data['main_title_%s'%code] = obj.main_title - data['title_%s'%code] = obj.title - data['keywords_%s'%code] = obj.keywords - data['descriptions_%s'%code] = obj.descriptions diff --git a/apps/theme/forms.py b/apps/theme/forms.py index c71820ff..9026c466 100644 --- a/apps/theme/forms.py +++ b/apps/theme/forms.py @@ -30,13 +30,6 @@ class ThemeForm(forms.Form): self.fields['name_%s' % code] = forms.CharField(label=_(u'Название'), required=required) self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget)#with saving form - #meta data - self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Description'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Keywords'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) def save(self, id=None): data = self.cleaned_data diff --git a/apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py b/apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py new file mode 100644 index 00000000..231b3205 --- /dev/null +++ b/apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'ThemeTranslation.keywords' + db.delete_column(u'theme_theme_translation', 'keywords') + + # Deleting field 'ThemeTranslation.title' + db.delete_column(u'theme_theme_translation', 'title') + + # Deleting field 'ThemeTranslation.descriptions' + db.delete_column(u'theme_theme_translation', 'descriptions') + + + def backwards(self, orm): + # Adding field 'ThemeTranslation.keywords' + db.add_column(u'theme_theme_translation', 'keywords', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + # Adding field 'ThemeTranslation.title' + db.add_column(u'theme_theme_translation', 'title', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + # Adding field 'ThemeTranslation.descriptions' + db.add_column(u'theme_theme_translation', 'descriptions', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + + models = { + u'theme.tag': { + 'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) + }, + u'theme.tagtranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TagTranslation', 'db_table': "u'theme_tag_translation'", 'index_together': '()'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'main_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Tag']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}) + }, + u'theme.theme': { + 'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'main_page_conf': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'main_page_expo': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) + }, + u'theme.themetranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeTranslation', 'db_table': "u'theme_theme_translation'", 'index_together': '()'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Theme']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + } + } + + complete_apps = ['theme'] \ No newline at end of file diff --git a/apps/theme/models.py b/apps/theme/models.py index c5c2736e..3fc7725d 100644 --- a/apps/theme/models.py +++ b/apps/theme/models.py @@ -47,11 +47,7 @@ class Theme(TranslatableModel): translations = TranslatedFields( name = models.CharField(max_length=255), main_title = models.CharField(max_length=255), - description = models.TextField(blank=True), - #-----meta data - title = models.CharField(max_length=255, blank=True), - descriptions = models.CharField(max_length=255, blank=True), - keywords = models.CharField(max_length=255, blank=True), + description = models.TextField(blank=True) ) main_page_conf = models.PositiveIntegerField(default=0, db_index=True) diff --git a/proj/admin.py b/proj/admin.py index 390ea1c1..2f83ba63 100644 --- a/proj/admin.py +++ b/proj/admin.py @@ -28,6 +28,7 @@ def ajax_city(request): objects = City.objects.language().filter(country=request.GET['id']).order_by('name') return render_to_response('select.html', {'objects': objects}) + def ajax_tag(request): """ @@ -127,14 +128,12 @@ def ajax_post_stat(request, obj_id=None): def ajax_delete_stat(request, id): redirect_to = request.META.get('HTTP_REFERER') - if id: try: Statistic.objects.get(id=id).delete() except Statistic.DoesNotExist: pass - return HttpResponseRedirect(redirect_to) diff --git a/proj/decorators.py b/proj/decorators.py deleted file mode 100644 index 149b9358..00000000 --- a/proj/decorators.py +++ /dev/null @@ -1,16 +0,0 @@ -from functools import wraps - -from django.template import RequestContext -from django.shortcuts import render_to_response - - -def render_to(tpl): - def decorator(func): - @wraps(func) - def wrapper(request, *args, **kwargs): - out = func(request, *args, **kwargs) - if isinstance(out, dict): - out = render_to_response(tpl, out, RequestContext(request)) - return out - return wrapper - return decorator \ No newline at end of file diff --git a/proj/middleware.py b/proj/middleware.py index 831abbac..cabfc7a0 100644 --- a/proj/middleware.py +++ b/proj/middleware.py @@ -52,8 +52,6 @@ class Referer(object): for key, val in data_exists.iteritems(): if val: if key == 'search': - print(request.session.get('search', [])) - print(request.session.get('search', []))[-2:] search = request.session.get('search', [])[-2:] search.append(val) request.session['search'] = search @@ -112,9 +110,6 @@ def check_places(slug): # https://gist.github.com/b1/3155460 -""" spaceless middleware -MIDDLEWARE_CLASSES += ('core_utils.middleware.SpacelessMiddleware',) -""" class SpacelessMiddleware(object): """ trim spaces between tags if not in DEBUG """ def process_response(self, request, response): diff --git a/proj/views.py b/proj/views.py index f1cb9667..709cad65 100644 --- a/proj/views.py +++ b/proj/views.py @@ -21,12 +21,6 @@ from emencia.django.newsletter.forms import SubscribeAssideForm from django.db.models.loading import get_model -def clear_slashes(str_): - if str_[0] == r'/': - str_ = str_[1:] - if str_[-1] == r'/': - str_ = str_[:-1] - return str_ def add_seo(request): url = request.path diff --git a/templates/c_admin/article/article_add.html b/templates/c_admin/article/article_add.html deleted file mode 100644 index 5589009b..00000000 --- a/templates/c_admin/article/article_add.html +++ /dev/null @@ -1,186 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{# Displays article form #} - - {% block scripts %} - - - {# selects #} - - - {# ajax #} - - - - {% endblock %} - -{% block body %} - -{# Uses multilang.html template for translated fields #} -
{% csrf_token %} -
- {% if obj_id %} Изменить {% else %} Добавить {% endif %}статью - -
-
-

Основная информация

-
-
- {# Hidden input uses for comparing with TmpFile objects #} - {{ form.key }} - {# Hidden input uses in clean method for checking url #} - {{ form.article_id }} - - {# main_title #} - - {% include 'c_admin/forms/multilang.html' with field='main_title' form=form languages=languages %} - {# theme #} -
- -
- {{ form.theme }} - {{ form.theme.errors }} -
-
- {# tag #} -
- -
- {{ form.tag }} - {{ form.tag.errors }} -
-
- {# preview #} - - {% include 'c_admin/forms/multilang.html' with field='preview' form=form languages=languages %} - - {# author #} -
- -
- {{ form.author }} - {{ form.author.errors }} -
-
- {# description #} - {% include 'c_admin/forms/multilang.html' with field='description' form=form languages=languages %} - {# keywords #} - - {% include 'c_admin/forms/multilang.html' with field='keywords' form=form languages=languages %} - - {# title #} - - {% include 'c_admin/forms/multilang.html' with field='title' form=form languages=languages %} - - {# descriptions #} - - {% include 'c_admin/forms/multilang.html' with field='descriptions' form=form languages=languages %} - -
- -
-
-
-

Файлы

-
-
- {# button that shows modal window with file form #} - Добавить файл - {# this div shows list of files and refreshes when new file added #} -
- - - - - - - - - - - - - {% for file in files %} - - - - - - - - - - {% endfor %} - -
idФайлИмяНазначение
{{ file.id }}{{ file.file_name }}{{ file.purpose }} - -
-
- -
-
- -
- - - -
- -
-
- - -{# modal window #} - - -{% endblock %} diff --git a/templates/c_admin/article/article_all.html b/templates/c_admin/article/article_all.html deleted file mode 100644 index bc901b9b..00000000 --- a/templates/c_admin/article/article_all.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends 'base.html' %} -{% block body %} -{% comment %} -Displays lists of all articles in the table - and creating buttons which can change each article -{% endcomment %} - -
-
-

Список статей

-
-
- - - - - - - - - - - - {% for item in objects %} - - - - - - - - - - - {% endfor %} - -
ЗаголовокАвтор 
{{ item.main_title }}{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %} - - Изменить - - - - Копировать - - - - Удалить - -
- Добавить статью -
- - -
- -{% endblock %} \ No newline at end of file diff --git a/templates/c_admin/article/article_confirm_delete.html b/templates/c_admin/article/article_confirm_delete.html index ac15985c..00dba2dd 100644 --- a/templates/c_admin/article/article_confirm_delete.html +++ b/templates/c_admin/article/article_confirm_delete.html @@ -8,4 +8,4 @@ Нет -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/c_admin/article/blog_form.html b/templates/c_admin/article/blog_form.html index e1c2366c..d1630cfe 100644 --- a/templates/c_admin/article/blog_form.html +++ b/templates/c_admin/article/blog_form.html @@ -1,34 +1,35 @@ {% extends 'base.html' %} -{% load static i18n %} - -{% block scripts %} - - {# selects #} - - - {# ajax #} - - - - - - - - - - - - -{% endblock %} +{% load static %} +{% load i18n %} +{# Displays article form #} + + {% block scripts %} + + + {# selects #} + + + + {# ajax #} + + + + + + + + + {% endblock %} {% block body %} {{ form.errors }} @@ -132,9 +133,38 @@ +
+
+

{% trans "Файлы" %}

+
+
+ {% if article %} + {# button that shows modal window with file form #} + {% trans "Добавить файл" %} + {% else %} +

{% trans "Файлы можно добавлять только после введения основных данных" %}

+ {% endif %} + {# this div shows list of files and refreshes when new file added #} +
+ - {% include 'c_admin/includes/filegallery.html' with object=article model='article.Article' %} + + + + + + + + + + + {% include 'file_list.html' with files=files %} + +
{% trans "id" %}{% trans "Файл" %}{% trans "Имя" %}{% trans "Назначение" %}
+
+
+
{% if form.draft %}
@@ -154,6 +184,7 @@ +{% include 'c_admin/includes/file_form.html' with file_form=file_form object=article %} {% endblock %} diff --git a/templates/c_admin/expobanner/link_list.html b/templates/c_admin/expobanner/link_list.html index 4bef0ff9..58cab8ba 100644 --- a/templates/c_admin/expobanner/link_list.html +++ b/templates/c_admin/expobanner/link_list.html @@ -35,7 +35,7 @@ {% endblock %}
{# pagination #} - {% include 'c_admin/includes/admin_pagination.html' with page_obj=object_list %} + {% include 'c_admin/includes/admin_pagination.html' %}
{% trans "Назад к управлению баннерами" %} {% endblock %} diff --git a/templates/c_admin/includes/admin_nav.html b/templates/c_admin/includes/admin_nav.html index 3ef8b43b..ab3f6355 100644 --- a/templates/c_admin/includes/admin_nav.html +++ b/templates/c_admin/includes/admin_nav.html @@ -52,6 +52,7 @@
  • {% trans 'Описание по умолчанию' %}
  • Мета
  • +
  • Список seo-текстов
  • Перевод
  • Редиректы
  • diff --git a/templates/c_admin/proj/settings.html b/templates/c_admin/proj/settings.html deleted file mode 100644 index 33728aec..00000000 --- a/templates/c_admin/proj/settings.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block body %} - -
    {% csrf_token %} -
    - Настройки -
    -
    -

    Основные настройки

    -
    -
    - {# key #} - {% with field='hall_capacity_tmpl' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} -
    -
    - - -
    - - -
    - -
    -
    - - -{% endblock %} diff --git a/templates/c_admin/theme/theme_add.html b/templates/c_admin/theme/theme_add.html index 73496583..cabcbcea 100644 --- a/templates/c_admin/theme/theme_add.html +++ b/templates/c_admin/theme/theme_add.html @@ -42,18 +42,6 @@ {% with field='description' form=form languages=languages %} {% include 'c_admin/forms/multilang.html' %} {% endwith %} - {# keywords #} - {% with field='keywords' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} - {# title #} - {% with field='title' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} - {# descriptions #} - {% with field='descriptions' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} diff --git a/templates/client/city/city.html b/templates/client/city/city.html deleted file mode 100644 index ca5797a7..00000000 --- a/templates/client/city/city.html +++ /dev/null @@ -1,150 +0,0 @@ -{% extends 'base_catalog.html' %} -{% load static %} -{% load i18n %} - -{% block bread_scrumbs %} - -{% endblock %} - -{% block page_title %} -{% endblock %} - -{% if object.get_events %} - {% block head_scripts %} - {% include "client/includes/banners/tops_head_js.html" %} - {% endblock head_scripts %} -{% endif %} - -{% block content_list %} -
    -
    - - -
    -
    -

    {{ object.name }}

    -
    - - - - - -
    -
      - {% if object.population %} -
    • {% trans 'Население' %}:{{ object.population }} {% trans 'человек' %}
    • - {% endif %} - - {% if object.code_IATA %} -
    • Код IATA:{{ object.code_IATA.code }}
    • - {% endif %} - - {% if object.phone_code %} -
    • {% trans 'Телефонный код' %}:+{{ object.phone_code }}
    • - {% endif %} - {% if object.transport %} -
    • {% trans 'Транспорт' %}:{{ object.transport }}
    • - {% endif %} -
    -
    - - - -
    -
    - - {% if object.famous_places %} - - - - - {% endif %} - {% if object.shoping %} - - - - - {% endif %} -
    {% trans 'Должны посетить' %}: - {{ object.famous_places }} -
    {% trans 'Шоппинг' %}: - {{ object.shoping }} -
    - - {% if object.description %} -
    -
    -

    {% trans "Описание" %}

    -
    - {{ object.description }} -
    -
    - {% endif %} - - {% if object.get_photos %} -
    -

    {% trans "Фотогалерея" %}

    - -
    - {% endif %} -
    - -{% if object.get_events %} -
    -
    - - {% include 'includes/exposition/exposition_list.html' with object_list=object.get_events %} -
    -{% endif %} - -{% if object.get_places %} -
    -
    - - {% include 'includes/place/place_list.html' with object_list=object.get_places %} -
    -{% endif %} - -{% if object.get_organisers %} -
    -
    - - {% include 'includes/organiser/organiser_list.html' with object_list=object.get_organisers %} -
    -{% endif %} - -{% endblock %} diff --git a/templates/client/exposition/catalog_theme.html b/templates/client/exposition/catalog_theme.html index 45277f6f..1dfdda66 100644 --- a/templates/client/exposition/catalog_theme.html +++ b/templates/client/exposition/catalog_theme.html @@ -56,7 +56,7 @@ {% block page_title %}
    -

    {% if meta %}{{ meta.h1 }}{% else %}{% trans 'Выставки' %}: {{ filter_object.name }}{% endif %}

    +

    {% if meta %}{{ meta.h1 }}{% elif seo_text %}{{ seo_text.title }}{% else %}{% trans 'Выставки' %}: {{ filter_object.name }}{% endif %}

    {% include 'includes/exposition/catalog_filter_period.html' %} diff --git a/templates/client/includes/meta.html b/templates/client/includes/meta.html index cfcbc5f7..aca926aa 100644 --- a/templates/client/includes/meta.html +++ b/templates/client/includes/meta.html @@ -32,6 +32,6 @@ {% else %} {% block title_head %}{% trans 'Expomap — выставки, конференции, семинары' %}{% endblock %} - + {% endif %} diff --git a/templates/client/includes/place/place_list.html b/templates/client/includes/place/place_list.html index 11a5ed46..4e5a3eff 100644 --- a/templates/client/includes/place/place_list.html +++ b/templates/client/includes/place/place_list.html @@ -1,61 +1,56 @@ -{% load static %} -{% load i18n %} +{% load static i18n %} -{% with objects=object_list %} - {% include 'client/includes/banners/tops.html' %} - -{% endwith %} + {% if forloop.counter == 10 %} + {% include 'client/includes/banners/catalog_inner.html' %} + {%endif %} + {% endfor %} + diff --git a/templates/client/place/place_detail.html b/templates/client/place/place_detail.html index 0b06f805..c82a8a2d 100644 --- a/templates/client/place/place_detail.html +++ b/templates/client/place/place_detail.html @@ -114,7 +114,7 @@ {% endif %} - {# TODO: request optization #} + {# TODO: request optimization #} {% if object.halls.count %}