remotes/origin/1203
kotzilla 12 years ago
parent b13b2700ab
commit 4622cc7745
  1. 6
      accounts/search_indexes.py
  2. 3
      article/admin.py
  3. 7
      company/search_indexes.py
  4. 3
      exposition/search_indexes.py
  5. 34
      functions/search_forms.py
  6. 116
      photologue/admin.py
  7. 14
      photologue/admin_urls.py
  8. 9
      photologue/client_urls.py
  9. 31
      photologue/client_view.py
  10. 73
      photologue/forms.py
  11. 12
      photologue/managers.py
  12. 111
      photologue/models.py
  13. 2
      photologue/templates/photologue/gallery_detail.html
  14. 5
      place_exposition/search_indexes.py
  15. 1
      proj/admin_urls.py
  16. 6
      proj/settings.py
  17. 7
      proj/urls.py
  18. 79
      schema.xml
  19. 182
      scheme.xml
  20. 8
      static/client/js/main.js
  21. 30
      static/client/js/pages/profile.js
  22. 16
      static/client/js/sendfilter.js
  23. 58
      templates/admin/photogallery/admin_gallery.html
  24. 47
      templates/admin/photogallery/admin_gallery_list.html
  25. 52
      templates/admin/photogallery/admin_photo.html
  26. 51
      templates/admin/photogallery/admin_photo_list.html
  27. 26
      templates/client/includes/catalog_search.html
  28. 126
      templates/client/photoreport/gallery.html
  29. 10
      templates/client/photoreport/photo.html
  30. 61
      templates/client/popups/photo.html
  31. 6
      templates/client/popups/place.html

@ -1,11 +1,11 @@
from haystack import indexes
from models import User
"""
"""
class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
first_name = indexes.CharField(model_attr='first_name')
last_name = indexes.CharField(model_attr='last_name')
# first_name = indexes.CharField(model_attr='first_name')
# last_name = indexes.CharField(model_attr='last_name')
email = indexes.NgramField(model_attr='email')
#email = indexes.CharField(model_attr='email')

@ -147,9 +147,6 @@ class BlogView(FormView):
form.save(author, article=self.obj)
return HttpResponseRedirect(self.success_url)
def form_invalid(self, form):
return HttpResponse(form.errors)
def get_form(self, form_class):
if self.request.POST:

@ -1,6 +1,6 @@
from haystack import indexes
from models import Company
"""
class CompanyIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
where = indexes.MultiValueField()
@ -15,8 +15,8 @@ class CompanyIndex(indexes.SearchIndex, indexes.Indexable):
return ''
def prepare_city(self, obj):
if obj.country:
return '%s'%obj.country.city
if obj.city:
return '%s'%obj.city.id
return ''
def prepare_theme(self, obj):
@ -43,3 +43,4 @@ class CompanyIndex(indexes.SearchIndex, indexes.Indexable):
return self.get_model().objects.filter()
"""

@ -39,5 +39,4 @@ class ExpositionIndex(indexes.SearchIndex, indexes.Indexable):
def index_queryset(self, using=None):
return self.get_model().objects.filter(is_published=True)
return self.get_model().objects.filter(is_published=True)

@ -18,6 +18,9 @@ class AbstactSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
class CompanySearchForm(AbstactSearchForm):
th = forms.MultipleChoiceField(label=_(u'Тематика'), required=False,
choices=[(theme.id, theme.name) for theme in Theme.objects.all()])
@ -78,8 +81,10 @@ class CompanySearchForm(AbstactSearchForm):
from country.models import Area
from theme.models import Theme
from django.utils import translation
class ExpositionSearchForm(forms.Form):
search_url = '/expo/search/'
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
@ -89,7 +94,11 @@ class ExpositionSearchForm(forms.Form):
area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.language()],
required=False, widget=forms.CheckboxSelectMultiple())
co = forms.CharField(label=_(u'Страна'), required=False, widget=forms.SelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.select_related('exposition_country')\
.filter(exposition_country__country__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()],
required=False, widget=forms.CheckboxSelectMultiple())
#co = forms.CharField(label=_(u'Страна'), required=False, widget=forms.SelectMultiple())
ci = forms.CharField(label=_(u'Город'), required=False, widget=forms.SelectMultiple())
fr = forms.DateField(required=False,
@ -99,6 +108,25 @@ class ExpositionSearchForm(forms.Form):
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateTo',
'placeholder': _(u'дд.мм.гггг')}))
def get_places_display(self):
display = ''
self.is_valid()
area = self.cleaned_data['area']
area_choices = self.fields['area'].choices
places = [choice[1] for choice in area_choices if str(choice[0]) in area]
country = self.cleaned_data['co']
country_choices = self.fields['co'].choices
places += [choice[1] for choice in country_choices if str(choice[0]) in country]
if not places:
return _(u'Не важно')
return ', '.join(places)
"""
def clean_area(self):
@ -107,7 +135,7 @@ class ExpositionSearchForm(forms.Form):
res = ast.literal_eval(area)
return res
return area
"""
def clean_co(self):
@ -117,6 +145,8 @@ class ExpositionSearchForm(forms.Form):
return res
return co
"""
def clean_ci(self):
ci = self.cleaned_data.get('ci')

@ -1,3 +1,4 @@
from django import forms
from django.conf import settings
from django.contrib import admin
@ -12,7 +13,7 @@ MULTISITE = getattr(settings, 'PHOTOLOGUE_MULTISITE', False)
ENABLE_TAGS = getattr(settings, 'PHOTOLOGUE_ENABLE_TAGS', False)
"""
class GalleryAdminForm(forms.ModelForm):
class Meta:
@ -44,16 +45,16 @@ class GalleryAdmin(admin.ModelAdmin):
]
def formfield_for_manytomany(self, db_field, request, **kwargs):
""" Set the current site as initial value. """
''' Set the current site as initial value. '''
if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()]
return super(GalleryAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
def save_related(self, request, form, *args, **kwargs):
"""
'''
If the user has saved a gallery with a photo that belongs only to
different Sites - it might cause much confusion. So let them know.
"""
'''
super(GalleryAdmin, self).save_related(request, form, *args, **kwargs)
orphaned_photos = form.instance.orphaned_photos()
if orphaned_photos:
@ -172,7 +173,7 @@ class PhotoAdmin(admin.ModelAdmin):
actions = ['add_photos_to_current_site', 'remove_photos_from_current_site']
def formfield_for_manytomany(self, db_field, request, **kwargs):
""" Set the current site as initial value. """
''' Set the current site as initial value. '''
if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()]
return super(PhotoAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
@ -252,3 +253,108 @@ class WatermarkAdmin(admin.ModelAdmin):
admin.site.register(Watermark, WatermarkAdmin)
"""
#------------------EXPOMAP VIEWS----------------------------------------------
from django.views.generic import ListView, FormView
from forms import PhotoForm, GalleryForm
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect
class AdminViewObject(FormView):
"""
need overwrite get_form method for every class
"""
form_class = None
model = None
template_name = None
success_url = None
obj = None
def set_obj(self):
"""
this method must be called in get_form method
to determine if we changing or creating
"""
slug = self.kwargs.get('slug')
if slug:
obj = get_object_or_404(self.model, slug=slug)
self.obj =obj
else:
self.obj = None
def form_valid(self, form):
form.save(obj=self.obj)
return HttpResponseRedirect(self.success_url)
def get_context_data(self, **kwargs):
context = super(AdminViewObject, self).get_context_data(**kwargs)
context['object'] = self.obj
context['languages'] = settings.LANGUAGES
return context
class PhotoView(AdminViewObject):
model = Photo
form_class = PhotoForm
template_name = 'photogallery/admin_photo.html'
success_url = '/admin/photogallery/photo/all/'
def get_form(self, form_class):
if self.request.POST:
return super(PhotoView, self).get_form(form_class)
self.set_obj()
if self.obj:
photo = self.obj
data = {}
data['image'] = photo.image.url
for code, name in settings.LANGUAGES:
obj = Photo._meta.translations_model.objects.get(language_code = code,master__id=getattr(photo, 'id')) #access to translated fields
data['title_%s' % code] = obj.title
data['caption_%s' % code] = obj.caption
#form.fields['tag'].widget.attrs['data-init-text'] = [item.name for item in article.tag.all()]
return form_class(data)
else:
return form_class()
class GalleryView(AdminViewObject):
model = Gallery
form_class = GalleryForm
template_name = 'photogallery/admin_gallery.html'
success_url = '/admin/photogallery/gallery/all/'
def get_form(self, form_class):
if self.request.POST:
return super(GalleryView, self).get_form(form_class)
self.set_obj()
if self.obj:
gallery = self.obj
data = {}
for code, name in settings.LANGUAGES:
obj = Gallery._meta.translations_model.objects.get(language_code = code,master__id=getattr(gallery, 'id')) #access to translated fields
data['title_%s' % code] = obj.title
data['description_%s' % code] = obj.description
#form.fields['tag'].widget.attrs['data-init-text'] = [item.name for item in article.tag.all()]
return form_class(data)
else:
return form_class()
class PhotoListView(ListView):
model = Photo
template_name = 'photogallery/admin_photo_list.html'
class GalleryListView(ListView):
model = Gallery
template_name = 'photogallery/admin_gallery_list.html'

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from admin import GalleryView, PhotoView, PhotoListView, GalleryListView
urlpatterns = patterns('',
url(r'^gallery/all/$', GalleryListView.as_view()),
url(r'^photo/all/$', PhotoListView.as_view()),
url(r'^gallery/$', GalleryView.as_view()),
url(r'^photo/$', PhotoView.as_view()),
url(r'^photo/(?P<slug>.*)/$', PhotoView.as_view()),
url(r'^gallery/(?P<slug>.*)/$', GalleryView.as_view()),
)

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from client_view import GalleryView, PhotoView
urlpatterns = patterns('',
url(r'gallery/(?P<slug>.*)$', GalleryView.as_view()),
url(r'photo/(?P<slug>.*)$', PhotoView.as_view()),
)

@ -0,0 +1,31 @@
import warnings
from django.conf import settings
from django.views.generic import DetailView, ListView
from photologue.models import Gallery, Photo
# Number of galleries to display per page.
GALLERY_PAGINATE_BY = getattr(settings, 'PHOTOLOGUE_GALLERY_PAGINATE_BY', 20)
if GALLERY_PAGINATE_BY != 20:
warnings.warn(
DeprecationWarning('PHOTOLOGUE_GALLERY_PAGINATE_BY setting will be removed in Photologue 3.1'))
# Number of photos to display per page.
PHOTO_PAGINATE_BY = getattr(settings, 'PHOTOLOGUE_PHOTO_PAGINATE_BY', 20)
if PHOTO_PAGINATE_BY != 20:
warnings.warn(
DeprecationWarning('PHOTOLOGUE_PHOTO_PAGINATE_BY setting will be removed in Photologue 3.1'))
class GalleryView(DetailView):
model = Gallery
slug_field = 'slug'
template_name = 'client/photoreport/gallery.html'
class PhotoView(DetailView):
model = Photo
slug_field = 'slug'
template_name = 'client/photoreport/photo.html'

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from functions.translate import fill_with_signal
from models import Gallery, Photo
class GalleryForm(forms.Form):
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(GalleryForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['title_%s' % code] = forms.CharField(label='Описание', required=required)
self.fields['description_%s' % code] = forms.CharField(label='Заголовок', required=required)
def save(self, obj=None):
data = self.cleaned_data
#create new Gallery object or get exists
if not obj:
gallery = Gallery()
else:
gallery = obj
fill_with_signal(Gallery, gallery, data)
return gallery
class PhotoForm(forms.Form):
image = forms.ImageField(label=u'Изображение')
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(PhotoForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['title_%s' % code] = forms.CharField(label='Описание', required=required)
self.fields['caption_%s' % code] = forms.CharField(label='Заголовок', required=required)
def save(self, obj=None):
data = self.cleaned_data
#create new Photo object or get exists
if not obj:
photo = Photo()
else:
photo = obj
photo.image = data['image']
fill_with_signal(Photo, photo, data)
return photo
class GalleryPhotoForm(PhotoForm):
def save(self, obj=None, gallery=None):
photo = super(GalleryPhotoForm, self).save(obj)
gallery.add(photo)

@ -1,5 +1,6 @@
from django.db.models.query import QuerySet
from django.conf import settings
from hvad.models import TranslationManager
class SharedQueries(object):
@ -15,9 +16,18 @@ class SharedQueries(object):
return self.filter(sites__id=settings.SITE_ID)
class GalleryQuerySet(SharedQueries, QuerySet):
class GalleryQuerySet(SharedQueries, TranslationManager):
pass
class PhotoQuerySet(SharedQueries, QuerySet):
pass
class PhotologueManager(TranslationManager):
def is_public(self):
"""Trivial filter - will probably become more complex as time goes by!"""
return self.filter(is_public=True)
def on_site(self):
"""Return objects linked to the current site only."""
return self.filter(sites__id=settings.SITE_ID)

@ -49,6 +49,7 @@ except ImportError:
from sortedm2m.fields import SortedManyToManyField
from model_utils.managers import PassThroughManager
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
# attempt to load the django-tagging TagField from default location,
# otherwise we substitude a dummy TagField.
@ -75,7 +76,9 @@ except ImportError:
from .utils import EXIF
from .utils.reflection import add_reflection
from .utils.watermark import apply_watermark
from .managers import GalleryQuerySet, PhotoQuerySet
from .managers import GalleryQuerySet, PhotoQuerySet, PhotologueManager
from functions.url_utils import slugify, unique_slug
from functions.model_utils import base_concrete_model
logger = logging.getLogger('photologue.models')
@ -157,17 +160,18 @@ IMAGE_FILTERS_HELP_TEXT = _(
@python_2_unicode_compatible
class Gallery(models.Model):
class Gallery(TranslatableModel):
translations = TranslatedFields(
title = models.CharField(_('title'), max_length=50),
description = models.TextField(_('description'), blank=True)
)
date_added = models.DateTimeField(_('date published'),
default=now)
title = models.CharField(_('title'),
max_length=50,
unique=True)
slug = models.SlugField(_('title slug'),
unique=True,
help_text=_('A "slug" is a unique URL-friendly title for an object.'))
description = models.TextField(_('description'),
blank=True)
is_public = models.BooleanField(_('is public'),
default=True,
help_text=_('Public galleries will be displayed '
@ -181,7 +185,7 @@ class Gallery(models.Model):
sites = models.ManyToManyField(Site, verbose_name=_(u'sites'),
blank=True, null=True)
objects = PassThroughManager.for_queryset_class(GalleryQuerySet)()
objects = PhotologueManager()
class Meta:
ordering = ['-date_added']
@ -190,7 +194,39 @@ class Gallery(models.Model):
verbose_name_plural = _('galleries')
def __str__(self):
return self.title
return self.lazy_translation_getter('title', self.pk)
def admin_url(self):
return '/admin/photogallery/gallery/%s'%self.slug
def translation_model(self):
return self._meta.translations_model
def generate_unique_slug(self):
"""
Create a unique slug by passing the result of get_slug() to
utils.urls.unique_slug, which appends an index if necessary.
"""
# For custom content types, use the ``Page`` instance for
# slug lookup.
concrete_model = base_concrete_model(Photo, self)
slug_qs = concrete_model.objects.exclude(id=self.id)
return unique_slug(slug_qs, "slug", self.get_slug())
def get_slug(self):
"""
Allows subclasses to implement their own slug creation logic.
"""
return slugify(self.get_available_title())
def get_available_title(self):
#print self.lazy_translation_getter('main_title', self.pk)
return u'%s'%self.lazy_translation_getter('title', self.pk)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.generate_unique_slug()
super(Gallery, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('pl-gallery', args=[self.slug])
@ -642,15 +678,18 @@ class ImageModel(models.Model):
@python_2_unicode_compatible
class Photo(ImageModel):
title = models.CharField(_('title'),
max_length=50,
unique=True)
class Photo(TranslatableModel, ImageModel):
translations = TranslatedFields(
title = models.CharField(_('title'),
max_length=50),
caption = models.TextField(_('caption'),
blank=True)
)
slug = models.SlugField(_('slug'),
unique=True,
help_text=_('A "slug" is a unique URL-friendly title for an object.'))
caption = models.TextField(_('caption'),
blank=True)
date_added = models.DateTimeField(_('date added'),
default=now)
is_public = models.BooleanField(_('is public'),
@ -660,7 +699,7 @@ class Photo(ImageModel):
sites = models.ManyToManyField(Site, verbose_name=_(u'sites'),
blank=True, null=True)
objects = PassThroughManager.for_queryset_class(PhotoQuerySet)()
objects = PhotologueManager()
class Meta:
ordering = ['-date_added']
@ -669,11 +708,38 @@ class Photo(ImageModel):
verbose_name_plural = _("photos")
def __str__(self):
return self.title
return self.get_available_title()
def translation_model(self):
return self._meta.translations_model
def admin_url(self):
return '/admin/photogallery/photo/%s'%self.slug
def generate_unique_slug(self):
"""
Create a unique slug by passing the result of get_slug() to
utils.urls.unique_slug, which appends an index if necessary.
"""
# For custom content types, use the ``Page`` instance for
# slug lookup.
concrete_model = base_concrete_model(Photo, self)
slug_qs = concrete_model.objects.exclude(id=self.id)
return unique_slug(slug_qs, "slug", self.get_slug())
def get_slug(self):
"""
Allows subclasses to implement their own slug creation logic.
"""
return slugify(self.get_available_title())
def get_available_title(self):
#print self.lazy_translation_getter('main_title', self.pk)
return u'%s'%self.lazy_translation_getter('title', self.pk)
def save(self, *args, **kwargs):
if self.slug is None:
self.slug = slugify(self.title)
if not self.slug:
self.slug = self.generate_unique_slug()
super(Photo, self).save(*args, **kwargs)
def get_absolute_url(self):
@ -1018,3 +1084,10 @@ def add_default_site(instance, created, **kwargs):
instance.sites.add(Site.objects.get_current())
post_save.connect(add_default_site, sender=Gallery)
post_save.connect(add_default_site, sender=Photo)
from django.db.models.signals import post_save
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Photo)
post_save.connect(post_save_handler, sender=Gallery)

@ -13,7 +13,7 @@
{% for photo in gallery.public %}
<a href="{{ photo.get_absolute_url }}">
<img src="{{ photo.get_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}">
<img src="{{ photo.get_admin_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}">
</a>
{% endfor %}

@ -5,9 +5,9 @@ from models import PlaceExposition
class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
where = indexes.MultiValueField()
#country = indexes.CharField(model_attr='country', null=True)
country = indexes.CharField(model_attr='country', null=True)
#city = indexes.CharField(model_attr='city', null=True)
"""
def prepare_country(self, obj):
if obj.country:
return '%s'%obj.country.id
@ -17,7 +17,6 @@ class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable):
if obj.city:
return '%s'%obj.country.city
return ''
"""
def prepare_where(self, obj):
country = [tr.name for tr in obj.country.translations.all()]

@ -12,6 +12,7 @@ urlpatterns = required(
url(r'^', include('import_xls.admin_urls')),
url(r'^accounts/', include('accounts.admin_urls')),
url(r'^article/', include('article.admin_urls')),
url(r'^photogallery/', include('photologue.admin_urls')),
url(r'^city/', include('city.admin_urls')),
url(r'^company/', include('company.admin_urls')),
url(r'^conference/', include('conference.admin_urls')),

@ -327,6 +327,8 @@ INSTALLED_APPS = (
'webinar',
#django modules
'sorl.thumbnail',
'photologue',
'sortedm2m',
'hvad',
'tinymce',
'ckeditor',
@ -337,7 +339,7 @@ INSTALLED_APPS = (
'password_reset',
#'social_auth',
'social.apps.django_app.default',
#'south',
'south',
#'debug_toolbar',
)
@ -345,7 +347,7 @@ INSTALLED_APPS = (
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://127.0.0.1:8983/solr'
'URL': 'http://localhost:8983/solr'
# ...or for multicore...
# 'URL': 'http://127.0.0.1:8983/solr/mysite',
},

@ -5,8 +5,12 @@ from core.views import PlaceListView, PlacePhotoView, PlaceSearchView, EventSear
from core.simple_index_view import AdvertisingView, AboutView
from views import MainPageView
from django.http import HttpResponse
def robots(request):
return HttpResponse('User-agent: * \nDisallow: /', content_type='text/plain')
urlpatterns = patterns('',
url(r'^robots.txt$', robots),
url(r'^$', MainPageView.as_view()),
url(r'^theme/', include('theme.urls')),
url(r'^', include('accounts.urls')),
@ -20,6 +24,7 @@ urlpatterns = patterns('',
url(r'^country/', include('country.urls')),
url(r'^city/', include('city.urls')),
url(r'^organiser/', include('organiser.urls')),
url(r'^gallery/', include('photologue.client_urls')),
url(r'^', include('file.urls')),
@ -71,4 +76,4 @@ if settings.DEBUG:
import debug_toolbar
urlpatterns += patterns('',
url(r'^__debug__/', include(debug_toolbar.urls)),
)
)

@ -1,21 +1,3 @@
<?xml version="1.0" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<schema name="default" version="1.4">
<types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
@ -26,19 +8,29 @@
a string value that isn't human-readable in its internal form,
but with a lexicographic ordering the same as the numeric ordering,
so that range queries work correctly. -->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true"
sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true"
sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true"
sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true"
sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true"
positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true"
positionIncrementGap="0"/>
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true"
positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true"
positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0"
positionIncrementGap="0"/>
<!-- A Trie based date field for faster date range queries and date faceting. -->
<fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
<fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6"
positionIncrementGap="0"/>
<fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
@ -47,15 +39,18 @@
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"
enablePositionIncrements="true" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true"
expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
@ -117,13 +112,15 @@
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
</analyzer>
</fieldType>
</types>
@ -148,9 +145,17 @@
<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="first_name" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="where" type="text_en" indexed="true" stored="true" multiValued="true" />
<field name="city" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="theme" type="text_en" indexed="true" stored="true" multiValued="true" />
<field name="tag" type="text_en" indexed="true" stored="true" multiValued="true" />
<field name="place" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="last_name" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="country" type="text_en" indexed="true" stored="true" multiValued="false" />
</fields>

@ -0,0 +1,182 @@
<?xml version="1.0" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<schema name="default" version="1.4">
<types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="binary" class="solr.BinaryField"/>
<!-- Numeric field types that manipulate the value into
a string value that isn't human-readable in its internal form,
but with a lexicographic ordering the same as the numeric ordering,
so that range queries work correctly. -->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/>
<!-- A Trie based date field for faster date range queries and date faceting. -->
<fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/>
<fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
<fieldtype name="geohash" class="solr.GeoHashField"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords_en.txt"
enablePositionIncrements="true"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
<filter class="solr.EnglishMinimalStemFilterFactory"/>
-->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords_en.txt"
enablePositionIncrements="true"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
<filter class="solr.EnglishMinimalStemFilterFactory"/>
-->
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>
</fieldType>
<fieldType name="ngram" class="solr.TextField" >
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
</analyzer>
</fieldType>
</types>
<fields>
<!-- general -->
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="django_id" type="string" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
<dynamicField name="*_t" type="text_en" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
<dynamicField name="*_d" type="double" indexed="true" stored="true"/>
<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
<dynamicField name="*_p" type="location" indexed="true" stored="true"/>
<dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false"/>
<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="where" type="text_en" indexed="true" stored="true" multiValued="true" />
<field name="data_begin" type="date" indexed="true" stored="true" multiValued="false" />
<field name="area_id" type="long" indexed="true" stored="true" multiValued="false" />
<field name="data_end" type="date" indexed="true" stored="true" multiValued="false" />
<field name="city_id" type="long" indexed="true" stored="true" multiValued="false" />
<field name="country_id" type="long" indexed="true" stored="true" multiValued="false" />
<field name="theme" type="text_en" indexed="true" stored="true" multiValued="true" />
<field name="tag" type="text_en" indexed="true" stored="true" multiValued="true" />
<field name="city" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="country" type="text_en" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- field to use to determine and enforce document uniqueness. -->
<uniqueKey>id</uniqueKey>
<!-- field for the QueryParser to use when an explicit fieldname is absent -->
<defaultSearchField>text</defaultSearchField>
<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
<solrQueryParser defaultOperator="AND"/>
</schema>

@ -97,6 +97,9 @@ function placeInput(width){
/* submiting registration form */
$(function () {
//--------------------------------------------
$('.pw-place form').submit(function() {
$(this).find('.places-list li.level2 label span input:checked').each(function() {
$(this).parents().eq(2).find('ul li input:checked').each(function() {
@ -110,7 +113,8 @@ function placeInput(width){
});
});
return false;
});
});
$('.search_form').on('submit', function(e){
e.preventDefault();
var action = $(this).attr('action');
@ -2023,7 +2027,7 @@ function placeInput(width){
$reply.find('#id_recipient').val(sender)
$reply.find('#reply_message').val(reply_message)
});
//--------------------------------------------
});

@ -1,14 +1,19 @@
function handleNameForm(data){
if (data.success){
/*
var fname = $this.find('#id_first_name').val()
var lname = $this.find('#id_last_name').val()
$this.parent().parent().prev().html(fname+' '+lname)
$this.next().click()
*/
window.location.reload();
}
}
function handleHomeForm(data){
if (data.success){
window.location.reload();
/*
var country = $this.find('#id_country option:selected').text();
var city = $this.find('#id_city option:selected').text();
@ -17,11 +22,14 @@ function handleHomeForm(data){
$this.parent().parent().prev().prev().find('a').html(country);
$this.next().click()
*/
}
}
function handleWorkForm(data){
if (data.success){
window.location.reload();
/*
var position = $this.find('#id_position').val();
var work = $this.find('#id_work').val();
@ -33,19 +41,25 @@ function handleWorkForm(data){
$this.parent().parent().prev().html(result);
$this.next().click()
*/
}
}
function handleAboutCompanyForm(data){
if (data.success){
window.location.reload();
/*
var about_company = $this.find('#id_about_company').val();
$this.parent().parent().prev().html(about_company);
$this.next().click();
*/
}
}
function handleSocialForm(data){
if (data.success){
window.location.reload();
/*
var fb = $this.find('#id_facebook').val();
var li = $this.find('#id_linkedin').val();
var tw = $this.find('#id_twitter').val();
@ -63,41 +77,54 @@ function handleSocialForm(data){
$ul.find('li:eq(3) a').attr('href', tw);
$this.next().click();
*/
}
}
function handlePhoneForm(data){
if (data.success){
window.location.reload();
/*
var phone = $this.find('#id_phone').val()
phone = '+'+phone.replace(/(\d{2})(\d{3})(\d{3})(\d{4})/, "$1 $2 $3 $4");
$this.parent().parent().prev().html(phone)
$this.next().click()
*/
}
}
function handleEmailForm(data){
if (data.success){
window.location.reload();
/*
var email = $this.find('#id_email').val()
$this.parent().parent().prev().html(email)
$this.parent().parent().prev().attr('href', 'mailto:'+url)
$this.next().click()
*/
}
}
function handleWebPageForm(data){
if (data.success){
if (data.success){
window.location.reload();
/*
var url = $this.find('#id_web_page').val()
$this.parent().parent().prev().attr('href', url)
$this.parent().parent().prev().html(url)
$this.next().click()
*/
}
}
function handleAboutForm(data){
if (data.success){
window.location.reload();
/*
var about = $this.find('#id_about').val()
$this.parent().parent().prev().html(about)
$this.next().click()
*/
}
}
@ -105,7 +132,6 @@ function handleCreateCompany(data){
if(data.success){
window.location = '/profile/company/'
}
console.log(data);
}
function formHandler(id, handleFunction){

@ -0,0 +1,16 @@
jQuery(function(){
$('.pw-place form').submit(function() {
$(this).find('.places-list li.level2 label span input:checked').each(function() {
$(this).parents().eq(2).find('ul li input:checked').each(function() {
$(this).prop('checked', false);
}
);
});
$(this).find('.places-list li.level1 label span input:checked').each(function() {
$(this).parents().eq(3).find('ul input:checked').each(function() {
$(this).prop('checked', false);
});
});
return false;
});
});

@ -0,0 +1,58 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" name="form" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}статью</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# description #}
{% include 'admin/forms/multilang.html' with field='description' form=form languages=languages %}
{# title #}
{% include 'admin/forms/multilang.html' with field='title' form=form languages=languages %}
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Фотографии</h2>
</div>
<div class="box-content">
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить фото</a>
<hr>
{# image #}
{% for photo in object.photos.all %}
<div class="photo" style="float: left;margin-right: 15px;">
<img src="{{ photo.get_admin_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}">
</div>
{% endfor %}
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="{% if article %}Изменить{% else %}Добавить{% endif %}">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -0,0 +1,47 @@
{% 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>Заголовок</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.title }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="{{ item.admin_url }}">
Изменить
</a>
</td>
<td class="center sorting_1">
<a class="btn-small btn-inverse" href="/admin/article/copy/{{ item.slug|lower }}">
Копировать
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="/admin/article/delete/{{ item.slug }}/">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/admin/photogallery/gallery/">
<i class="icon-plus-sign icon-white"></i> Добавить фото
</a>
</div>
</div>
{% endblock %}

@ -0,0 +1,52 @@
{% extends 'base.html' %}
{% load static %}
{% load photologue_tags i18n %}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" name="form" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}фото</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# image #}
<div class="control-group {% if form.image.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.image.label }}:</b></label>
<div class="controls">
{{ form.image }}
<span class="help-inline">{{ form.image.errors }}</span>
</div>
</div>
<img src="{{ object.get_admin_thumbnail_url }}" class="thumbnail" alt="{{ object.title }}">
{# title #}
{% include 'admin/forms/multilang.html' with field='title' form=form languages=languages %}
{# caption #}
{% include 'admin/forms/multilang.html' with field='caption' form=form languages=languages %}
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="{% if article %}Изменить{% else %}Добавить{% endif %}">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -0,0 +1,51 @@
{% 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>Заголовок</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.title }}</td>
<td>
<img src="{{ item.get_admin_thumbnail_url }}" class="thumbnail" alt="{{ item.title }}">
</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="{{ item.admin_url }}">
Изменить
</a>
</td>
<td class="center sorting_1">
<a class="btn-small btn-inverse" href="#">
Копировать
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="#">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/admin/photogallery/photo/">
<i class="icon-plus-sign icon-white"></i> Добавить фото
</a>
</div>
</div>
{% endblock %}

@ -2,7 +2,7 @@
{% load i18n %}
<div class="in-search-form">
<form action="{{ search_action }}" class="search_form">
<form action="{{ search_form.search_url }}" class="search_form">
<div class="s-title">{% if type %}{{ type }}{% else %}{% trans 'поиск событий' %}{% endif %}</div>
<div class="search-form-wrap">
<div class="search-line">
@ -24,8 +24,28 @@
</div>
<div class="search-line sl-options">
{% ifnotequal type 'places search' %}<div class="sf-field-wrap">{% trans 'Тематика: ' %}<a class="pw-open" href="#pw-subj">Не важно</a></div>{% endifnotequal %}
<div class="sf-field-wrap">{% trans 'Место: ' %}<a class="pw-open" href="#pw-place">Не важно</a></div>
{% ifnotequal type 'places search' %}<div class="sf-field-wrap">{% trans 'Период: ' %}<a class="pw-open" href="#pw-period">Не важно</a></div>{% endifnotequal %}
<div class="sf-field-wrap">{% trans 'Место: ' %}
<a class="pw-open" href="#pw-place">
{{ search_form.get_places_display }}
</a></div>
{% ifnotequal type 'places search' %}
<div class="sf-field-wrap">{% trans 'Период: ' %}
<a class="pw-open" href="#pw-period">
{% if search_form.fr.value or search_form.to.value %}
{% if search_form.fr.value %}
c {{ search_form.fr.value }}
{% endif %}
{% if search_form.to.value %}
по {{ search_form.to.value }}
{% endif %}
{% else %}
Не важно
{% endif %}
</a>
</div>
{% endifnotequal %}
</div>
</div>
</form>

@ -0,0 +1,126 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% load static %}
{% block page_body %}
<div class="m-article cl-photos">
<div class="cl-item">
<div class="cl-item-wrap clearfix">
<div class="cli-pict">
<a href="#">
{% with obj=photoreport %}
{% include 'client/includes/show_logo.html' %}
{% endwith %}
</a>
</div>
<div class="cli-info">
<div class="cli-top clearfix">
<header>
<div class="cli-title">
<a href="#">{{ photoreport.name }}</a>
</div>
</header>
<div class="cli-descr">
{{ photoreport.get_event.main_title|safe }}
</div>
</div>
<div class="cli-bot clearfix">
<div class="cli-date">
{% with obj=photoreport.get_event %}
{% include 'client/includes/show_date_block.html' %}
{% endwith %}
</div>
<div class="cli-place">
<a href="#">{{ photoreport.get_event.country }}</a>, <a href="#">{{ photoreport.get_event.city }}</a>
{% if photoreport.get_event.place %}
, <a href="/place/{{ photoreport.get_event.place.url }}">{{ photoreport.get_event.place }}</a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
<div class="cli-photo-text">
{{ photoreport.description|safe }}
</div>
<div id="cli-pg" class="cli-photo-gallery">
<ul class="clearfix">
{% for photo in object.photos.all %}
<li>
<a class="open-photo" href="#" >
<img src="{{ photo.get_client_thumbnail_url }}" data-user-id="{{ user.id }}" alt=""
data-image-id="{{ photo.id }}" data-album-id="{{ photoreport.id }}"
data-image-name="{{ photo.name }}" data-image-description="{{ photo.description }}"/>
<span class="pg-title">{{ photo.title }}</span>
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}
{% block photogallery %}
<div id="pw-gallery" class="popup-gallery-container">
<div class="pg-container-wrap">
<div class="popup-gallery-outer">
<div class="popup-gallery">
<a class="pg-close"></a>
<div class="pg-wrap clearfix">
<div class="pg-photos">
<img src="{% static 'client/img/_del-temp/glr-1.jpg' %}" width="730" height="533" alt="" class="photoTag"
data-user-id="25" data-image-id="150" data-album-id="150"/>
</div>
<div class="pg-info">
<div class="pgi-wrap scroll-container">
<div class="pg-photo-info">
<div class="pg-photo-title"></div>
<div class="pg-photo-text"></div>
<hr />
<div class="pg-photo-descr">
<h3>{% trans 'На фотографии отмечены' %}:</h3>
</div>
<hr />
</div>
<div class="pg-comments">
<div class="pgc-title">{% trans 'Коментарии' %}:</div>
<div class="pgc-body">
<ul>
</ul>
</div>
</div>
</div>
{% if user.is_authenticated %}
<form class="pgc-form">
<hr />
<div class="pgc-field">
<label for="comment">{% trans 'Оставьте свой комментарий' %}:</label>
<textarea name="comment" id="comment" cols="30" rows="10"></textarea>
</div>
<div class="pgc-buttons">
<button type="submit" class="icon-check">ок</button>
<a class="button blue icon-tag addTag" id="externalLink" href="#">{% trans 'отметить человека' %}</a>
</div>
</form>
{% endif %}
</div>
</div>
<div class="pg-photos-controls">
<a class="pgpc-prev" href="#">&lt;</a>
<a class="pgpc-next" href="#">&gt;</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1,10 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% load static %}
{% block page_body %}
{% include 'client/popups/photo.html' with photo=object %}
{% endblock %}

@ -0,0 +1,61 @@
{% load i18n %}
{% load static %}
<div id="pw-gallery" class="popup-gallery-container">
<div class="pg-container-wrap">
<div class="popup-gallery-outer">
<div class="popup-gallery">
<a class="pg-close"></a>
<div class="pg-wrap clearfix">
<div class="pg-photos">
<img src="{{ photo.get_display_url}}" alt="{{ photo.title }}" class="photoTag"
data-user-id="25" data-image-id="150" data-album-id="150"/>
</div>
<div class="pg-info">
<div class="pgi-wrap scroll-container">
<div class="pg-photo-info">
<div class="pg-photo-title">{{ photo.title }}</div>
<div class="pg-photo-text"></div>
<hr />
<div class="pg-photo-descr">
<h3>{% trans 'На фотографии отмечены' %}:</h3>
</div>
<hr />
</div>
<div class="pg-comments">
<div class="pgc-title">{% trans 'Коментарии' %}:</div>
<div class="pgc-body">
<ul>
</ul>
</div>
</div>
</div>
{% if user.is_authenticated %}
<form class="pgc-form">
<hr />
<div class="pgc-field">
<label for="comment">{% trans 'Оставьте свой комментарий' %}:</label>
<textarea name="comment" id="comment" cols="30" rows="10"></textarea>
</div>
<div class="pgc-buttons">
<button type="submit" class="icon-check">ок</button>
<a class="button blue icon-tag addTag" id="externalLink" href="#">{% trans 'отметить человека' %}</a>
</div>
</form>
{% endif %}
</div>
</div>
<div class="pg-photos-controls">
<a class="pgpc-prev" href="#">&lt;</a>
<a class="pgpc-next" href="#">&gt;</a>
</div>
</div>
</div>
</div>
</div>

@ -7,7 +7,7 @@
<div class="pw-title">{% trans 'Место' %}</div>
</header>
<div class="pw-body clearfix">
<form class="pw-form search_form" action="{{ search_action }}">
<form class="pw-form search_form" action="{{ search_form.search_url }}">
<div class="c-select-box-wrap">
<div class="c-select-box places">
<div class="csb-title">
@ -31,7 +31,7 @@
<ul>
{% for country in value|get_country_by_area %}
<li class="level2">
<label><input type="checkbox" name="c" value="{{ country.id }}" /><span class="hidden">{{ country.name }}</span></label>
<label><input type="checkbox" name="co" value="{{ country.id }}" /><span class="hidden">{{ country.name }}</span></label>
<a href="#">{{ country.name }}</a>
{% if country.id|get_city_by_country %}
<ul>
@ -48,7 +48,7 @@
{% endif %}
</li>
{% endfor %}
{{ search_form.area }}
</ul>
</div>
<div class="q-sel">

Loading…
Cancel
Save