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 haystack import indexes
from models import User from models import User
"""
"""
class UserIndex(indexes.SearchIndex, indexes.Indexable): class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True) text = indexes.CharField(document=True, use_template=True)
first_name = indexes.CharField(model_attr='first_name') # first_name = indexes.CharField(model_attr='first_name')
last_name = indexes.CharField(model_attr='last_name') # last_name = indexes.CharField(model_attr='last_name')
email = indexes.NgramField(model_attr='email') email = indexes.NgramField(model_attr='email')
#email = indexes.CharField(model_attr='email') #email = indexes.CharField(model_attr='email')

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

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

@ -39,5 +39,4 @@ class ExpositionIndex(indexes.SearchIndex, indexes.Indexable):
def index_queryset(self, using=None): 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) q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False) w = forms.CharField(label=_(u'Где'), required=False)
class CompanySearchForm(AbstactSearchForm): class CompanySearchForm(AbstactSearchForm):
th = forms.MultipleChoiceField(label=_(u'Тематика'), required=False, th = forms.MultipleChoiceField(label=_(u'Тематика'), required=False,
choices=[(theme.id, theme.name) for theme in Theme.objects.all()]) choices=[(theme.id, theme.name) for theme in Theme.objects.all()])
@ -78,8 +81,10 @@ class CompanySearchForm(AbstactSearchForm):
from country.models import Area from country.models import Area
from theme.models import Theme from theme.models import Theme
from django.utils import translation
class ExpositionSearchForm(forms.Form): class ExpositionSearchForm(forms.Form):
search_url = '/expo/search/'
q = forms.CharField(label=_(u'Поиск'), required=False) q = forms.CharField(label=_(u'Поиск'), required=False)
w = 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()], area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.language()],
required=False, widget=forms.CheckboxSelectMultiple()) 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()) ci = forms.CharField(label=_(u'Город'), required=False, widget=forms.SelectMultiple())
fr = forms.DateField(required=False, fr = forms.DateField(required=False,
@ -99,6 +108,25 @@ class ExpositionSearchForm(forms.Form):
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateTo', widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateTo',
'placeholder': _(u'дд.мм.гггг')})) '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): def clean_area(self):
@ -107,7 +135,7 @@ class ExpositionSearchForm(forms.Form):
res = ast.literal_eval(area) res = ast.literal_eval(area)
return res return res
return area return area
"""
def clean_co(self): def clean_co(self):
@ -117,6 +145,8 @@ class ExpositionSearchForm(forms.Form):
return res return res
return co return co
"""
def clean_ci(self): def clean_ci(self):
ci = self.cleaned_data.get('ci') ci = self.cleaned_data.get('ci')

@ -1,3 +1,4 @@
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib import admin from django.contrib import admin
@ -12,7 +13,7 @@ MULTISITE = getattr(settings, 'PHOTOLOGUE_MULTISITE', False)
ENABLE_TAGS = getattr(settings, 'PHOTOLOGUE_ENABLE_TAGS', False) ENABLE_TAGS = getattr(settings, 'PHOTOLOGUE_ENABLE_TAGS', False)
"""
class GalleryAdminForm(forms.ModelForm): class GalleryAdminForm(forms.ModelForm):
class Meta: class Meta:
@ -44,16 +45,16 @@ class GalleryAdmin(admin.ModelAdmin):
] ]
def formfield_for_manytomany(self, db_field, request, **kwargs): 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": if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()] kwargs["initial"] = [Site.objects.get_current()]
return super(GalleryAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) return super(GalleryAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
def save_related(self, request, form, *args, **kwargs): def save_related(self, request, form, *args, **kwargs):
""" '''
If the user has saved a gallery with a photo that belongs only to 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. different Sites - it might cause much confusion. So let them know.
""" '''
super(GalleryAdmin, self).save_related(request, form, *args, **kwargs) super(GalleryAdmin, self).save_related(request, form, *args, **kwargs)
orphaned_photos = form.instance.orphaned_photos() orphaned_photos = form.instance.orphaned_photos()
if orphaned_photos: if orphaned_photos:
@ -172,7 +173,7 @@ class PhotoAdmin(admin.ModelAdmin):
actions = ['add_photos_to_current_site', 'remove_photos_from_current_site'] actions = ['add_photos_to_current_site', 'remove_photos_from_current_site']
def formfield_for_manytomany(self, db_field, request, **kwargs): 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": if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()] kwargs["initial"] = [Site.objects.get_current()]
return super(PhotoAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) return super(PhotoAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
@ -252,3 +253,108 @@ class WatermarkAdmin(admin.ModelAdmin):
admin.site.register(Watermark, WatermarkAdmin) 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.db.models.query import QuerySet
from django.conf import settings from django.conf import settings
from hvad.models import TranslationManager
class SharedQueries(object): class SharedQueries(object):
@ -15,9 +16,18 @@ class SharedQueries(object):
return self.filter(sites__id=settings.SITE_ID) return self.filter(sites__id=settings.SITE_ID)
class GalleryQuerySet(SharedQueries, QuerySet): class GalleryQuerySet(SharedQueries, TranslationManager):
pass pass
class PhotoQuerySet(SharedQueries, QuerySet): class PhotoQuerySet(SharedQueries, QuerySet):
pass 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 sortedm2m.fields import SortedManyToManyField
from model_utils.managers import PassThroughManager from model_utils.managers import PassThroughManager
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
# attempt to load the django-tagging TagField from default location, # attempt to load the django-tagging TagField from default location,
# otherwise we substitude a dummy TagField. # otherwise we substitude a dummy TagField.
@ -75,7 +76,9 @@ except ImportError:
from .utils import EXIF from .utils import EXIF
from .utils.reflection import add_reflection from .utils.reflection import add_reflection
from .utils.watermark import apply_watermark 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') logger = logging.getLogger('photologue.models')
@ -157,17 +160,18 @@ IMAGE_FILTERS_HELP_TEXT = _(
@python_2_unicode_compatible @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'), date_added = models.DateTimeField(_('date published'),
default=now) default=now)
title = models.CharField(_('title'),
max_length=50,
unique=True)
slug = models.SlugField(_('title slug'), slug = models.SlugField(_('title slug'),
unique=True, unique=True,
help_text=_('A "slug" is a unique URL-friendly title for an object.')) 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'), is_public = models.BooleanField(_('is public'),
default=True, default=True,
help_text=_('Public galleries will be displayed ' help_text=_('Public galleries will be displayed '
@ -181,7 +185,7 @@ class Gallery(models.Model):
sites = models.ManyToManyField(Site, verbose_name=_(u'sites'), sites = models.ManyToManyField(Site, verbose_name=_(u'sites'),
blank=True, null=True) blank=True, null=True)
objects = PassThroughManager.for_queryset_class(GalleryQuerySet)() objects = PhotologueManager()
class Meta: class Meta:
ordering = ['-date_added'] ordering = ['-date_added']
@ -190,7 +194,39 @@ class Gallery(models.Model):
verbose_name_plural = _('galleries') verbose_name_plural = _('galleries')
def __str__(self): 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): def get_absolute_url(self):
return reverse('pl-gallery', args=[self.slug]) return reverse('pl-gallery', args=[self.slug])
@ -642,15 +678,18 @@ class ImageModel(models.Model):
@python_2_unicode_compatible @python_2_unicode_compatible
class Photo(ImageModel): class Photo(TranslatableModel, ImageModel):
title = models.CharField(_('title'), translations = TranslatedFields(
max_length=50, title = models.CharField(_('title'),
unique=True) max_length=50),
caption = models.TextField(_('caption'),
blank=True)
)
slug = models.SlugField(_('slug'), slug = models.SlugField(_('slug'),
unique=True, unique=True,
help_text=_('A "slug" is a unique URL-friendly title for an object.')) 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'), date_added = models.DateTimeField(_('date added'),
default=now) default=now)
is_public = models.BooleanField(_('is public'), is_public = models.BooleanField(_('is public'),
@ -660,7 +699,7 @@ class Photo(ImageModel):
sites = models.ManyToManyField(Site, verbose_name=_(u'sites'), sites = models.ManyToManyField(Site, verbose_name=_(u'sites'),
blank=True, null=True) blank=True, null=True)
objects = PassThroughManager.for_queryset_class(PhotoQuerySet)() objects = PhotologueManager()
class Meta: class Meta:
ordering = ['-date_added'] ordering = ['-date_added']
@ -669,11 +708,38 @@ class Photo(ImageModel):
verbose_name_plural = _("photos") verbose_name_plural = _("photos")
def __str__(self): 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): def save(self, *args, **kwargs):
if self.slug is None: if not self.slug:
self.slug = slugify(self.title) self.slug = self.generate_unique_slug()
super(Photo, self).save(*args, **kwargs) super(Photo, self).save(*args, **kwargs)
def get_absolute_url(self): def get_absolute_url(self):
@ -1018,3 +1084,10 @@ def add_default_site(instance, created, **kwargs):
instance.sites.add(Site.objects.get_current()) instance.sites.add(Site.objects.get_current())
post_save.connect(add_default_site, sender=Gallery) post_save.connect(add_default_site, sender=Gallery)
post_save.connect(add_default_site, sender=Photo) 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 %} {% for photo in gallery.public %}
<a href="{{ photo.get_absolute_url }}"> <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> </a>
{% endfor %} {% endfor %}

@ -5,9 +5,9 @@ from models import PlaceExposition
class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True) text = indexes.CharField(document=True, use_template=True)
where = indexes.MultiValueField() 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) #city = indexes.CharField(model_attr='city', null=True)
"""
def prepare_country(self, obj): def prepare_country(self, obj):
if obj.country: if obj.country:
return '%s'%obj.country.id return '%s'%obj.country.id
@ -17,7 +17,6 @@ class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable):
if obj.city: if obj.city:
return '%s'%obj.country.city return '%s'%obj.country.city
return '' return ''
"""
def prepare_where(self, obj): def prepare_where(self, obj):
country = [tr.name for tr in obj.country.translations.all()] 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'^', include('import_xls.admin_urls')),
url(r'^accounts/', include('accounts.admin_urls')), url(r'^accounts/', include('accounts.admin_urls')),
url(r'^article/', include('article.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'^city/', include('city.admin_urls')),
url(r'^company/', include('company.admin_urls')), url(r'^company/', include('company.admin_urls')),
url(r'^conference/', include('conference.admin_urls')), url(r'^conference/', include('conference.admin_urls')),

@ -327,6 +327,8 @@ INSTALLED_APPS = (
'webinar', 'webinar',
#django modules #django modules
'sorl.thumbnail', 'sorl.thumbnail',
'photologue',
'sortedm2m',
'hvad', 'hvad',
'tinymce', 'tinymce',
'ckeditor', 'ckeditor',
@ -337,7 +339,7 @@ INSTALLED_APPS = (
'password_reset', 'password_reset',
#'social_auth', #'social_auth',
'social.apps.django_app.default', 'social.apps.django_app.default',
#'south', 'south',
#'debug_toolbar', #'debug_toolbar',
) )
@ -345,7 +347,7 @@ INSTALLED_APPS = (
HAYSTACK_CONNECTIONS = { HAYSTACK_CONNECTIONS = {
'default': { 'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine', 'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://127.0.0.1:8983/solr' 'URL': 'http://localhost:8983/solr'
# ...or for multicore... # ...or for multicore...
# 'URL': 'http://127.0.0.1:8983/solr/mysite', # '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 core.simple_index_view import AdvertisingView, AboutView
from views import MainPageView from views import MainPageView
from django.http import HttpResponse
def robots(request):
return HttpResponse('User-agent: * \nDisallow: /', content_type='text/plain')
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^robots.txt$', robots),
url(r'^$', MainPageView.as_view()), url(r'^$', MainPageView.as_view()),
url(r'^theme/', include('theme.urls')), url(r'^theme/', include('theme.urls')),
url(r'^', include('accounts.urls')), url(r'^', include('accounts.urls')),
@ -20,6 +24,7 @@ urlpatterns = patterns('',
url(r'^country/', include('country.urls')), url(r'^country/', include('country.urls')),
url(r'^city/', include('city.urls')), url(r'^city/', include('city.urls')),
url(r'^organiser/', include('organiser.urls')), url(r'^organiser/', include('organiser.urls')),
url(r'^gallery/', include('photologue.client_urls')),
url(r'^', include('file.urls')), url(r'^', include('file.urls')),
@ -71,4 +76,4 @@ if settings.DEBUG:
import debug_toolbar import debug_toolbar
urlpatterns += patterns('', urlpatterns += patterns('',
url(r'^__debug__/', include(debug_toolbar.urls)), 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"> <schema name="default" version="1.4">
<types> <types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <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, a string value that isn't human-readable in its internal form,
but with a lexicographic ordering the same as the numeric ordering, but with a lexicographic ordering the same as the numeric ordering,
so that range queries work correctly. --> so that range queries work correctly. -->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true"
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true"
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true"
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true"
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> sortMissingLast="true" positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true"
<fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/> 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. --> <!-- 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="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/> <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
@ -47,15 +39,18 @@
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index"> <analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/> <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 <!-- 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"/> <filter class="solr.LowerCaseFilterFactory"/>
</analyzer> </analyzer>
<analyzer type="query"> <analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/> <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.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/>
</analyzer> </analyzer>
@ -117,13 +112,15 @@
<analyzer type="index"> <analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" /> <tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" /> <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" /> <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
</analyzer> </analyzer>
<analyzer type="query"> <analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" /> <tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" /> <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> </analyzer>
</fieldType> </fieldType>
</types> </types>
@ -148,9 +145,17 @@
<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" /> <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> </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 */ /* submiting registration form */
$(function () { $(function () {
//--------------------------------------------
$('.pw-place form').submit(function() { $('.pw-place form').submit(function() {
$(this).find('.places-list li.level2 label span input:checked').each(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).parents().eq(2).find('ul li input:checked').each(function() {
@ -110,7 +113,8 @@ function placeInput(width){
}); });
}); });
return false; return false;
}); });
$('.search_form').on('submit', function(e){ $('.search_form').on('submit', function(e){
e.preventDefault(); e.preventDefault();
var action = $(this).attr('action'); var action = $(this).attr('action');
@ -2023,7 +2027,7 @@ function placeInput(width){
$reply.find('#id_recipient').val(sender) $reply.find('#id_recipient').val(sender)
$reply.find('#reply_message').val(reply_message) $reply.find('#reply_message').val(reply_message)
}); });
//--------------------------------------------
}); });

@ -1,14 +1,19 @@
function handleNameForm(data){ function handleNameForm(data){
if (data.success){ if (data.success){
/*
var fname = $this.find('#id_first_name').val() var fname = $this.find('#id_first_name').val()
var lname = $this.find('#id_last_name').val() var lname = $this.find('#id_last_name').val()
$this.parent().parent().prev().html(fname+' '+lname) $this.parent().parent().prev().html(fname+' '+lname)
$this.next().click() $this.next().click()
*/
window.location.reload();
} }
} }
function handleHomeForm(data){ function handleHomeForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var country = $this.find('#id_country option:selected').text(); var country = $this.find('#id_country option:selected').text();
var city = $this.find('#id_city 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.parent().parent().prev().prev().find('a').html(country);
$this.next().click() $this.next().click()
*/
} }
} }
function handleWorkForm(data){ function handleWorkForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var position = $this.find('#id_position').val(); var position = $this.find('#id_position').val();
var work = $this.find('#id_work').val(); var work = $this.find('#id_work').val();
@ -33,19 +41,25 @@ function handleWorkForm(data){
$this.parent().parent().prev().html(result); $this.parent().parent().prev().html(result);
$this.next().click() $this.next().click()
*/
} }
} }
function handleAboutCompanyForm(data){ function handleAboutCompanyForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var about_company = $this.find('#id_about_company').val(); var about_company = $this.find('#id_about_company').val();
$this.parent().parent().prev().html(about_company); $this.parent().parent().prev().html(about_company);
$this.next().click(); $this.next().click();
*/
} }
} }
function handleSocialForm(data){ function handleSocialForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var fb = $this.find('#id_facebook').val(); var fb = $this.find('#id_facebook').val();
var li = $this.find('#id_linkedin').val(); var li = $this.find('#id_linkedin').val();
var tw = $this.find('#id_twitter').val(); var tw = $this.find('#id_twitter').val();
@ -63,41 +77,54 @@ function handleSocialForm(data){
$ul.find('li:eq(3) a').attr('href', tw); $ul.find('li:eq(3) a').attr('href', tw);
$this.next().click(); $this.next().click();
*/
} }
} }
function handlePhoneForm(data){ function handlePhoneForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var phone = $this.find('#id_phone').val() var phone = $this.find('#id_phone').val()
phone = '+'+phone.replace(/(\d{2})(\d{3})(\d{3})(\d{4})/, "$1 $2 $3 $4"); phone = '+'+phone.replace(/(\d{2})(\d{3})(\d{3})(\d{4})/, "$1 $2 $3 $4");
$this.parent().parent().prev().html(phone) $this.parent().parent().prev().html(phone)
$this.next().click() $this.next().click()
*/
} }
} }
function handleEmailForm(data){ function handleEmailForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var email = $this.find('#id_email').val() var email = $this.find('#id_email').val()
$this.parent().parent().prev().html(email) $this.parent().parent().prev().html(email)
$this.parent().parent().prev().attr('href', 'mailto:'+url) $this.parent().parent().prev().attr('href', 'mailto:'+url)
$this.next().click() $this.next().click()
*/
} }
} }
function handleWebPageForm(data){ function handleWebPageForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var url = $this.find('#id_web_page').val() var url = $this.find('#id_web_page').val()
$this.parent().parent().prev().attr('href', url) $this.parent().parent().prev().attr('href', url)
$this.parent().parent().prev().html(url) $this.parent().parent().prev().html(url)
$this.next().click() $this.next().click()
*/
} }
} }
function handleAboutForm(data){ function handleAboutForm(data){
if (data.success){ if (data.success){
window.location.reload();
/*
var about = $this.find('#id_about').val() var about = $this.find('#id_about').val()
$this.parent().parent().prev().html(about) $this.parent().parent().prev().html(about)
$this.next().click() $this.next().click()
*/
} }
} }
@ -105,7 +132,6 @@ function handleCreateCompany(data){
if(data.success){ if(data.success){
window.location = '/profile/company/' window.location = '/profile/company/'
} }
console.log(data);
} }
function formHandler(id, handleFunction){ 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 %} {% load i18n %}
<div class="in-search-form"> <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="s-title">{% if type %}{{ type }}{% else %}{% trans 'поиск событий' %}{% endif %}</div>
<div class="search-form-wrap"> <div class="search-form-wrap">
<div class="search-line"> <div class="search-line">
@ -24,8 +24,28 @@
</div> </div>
<div class="search-line sl-options"> <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 %} {% 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>
</div> </div>
</form> </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> <div class="pw-title">{% trans 'Место' %}</div>
</header> </header>
<div class="pw-body clearfix"> <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-wrap">
<div class="c-select-box places"> <div class="c-select-box places">
<div class="csb-title"> <div class="csb-title">
@ -31,7 +31,7 @@
<ul> <ul>
{% for country in value|get_country_by_area %} {% for country in value|get_country_by_area %}
<li class="level2"> <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> <a href="#">{{ country.name }}</a>
{% if country.id|get_city_by_country %} {% if country.id|get_city_by_country %}
<ul> <ul>
@ -48,7 +48,7 @@
{% endif %} {% endif %}
</li> </li>
{% endfor %} {% endfor %}
{{ search_form.area }}
</ul> </ul>
</div> </div>
<div class="q-sel"> <div class="q-sel">

Loading…
Cancel
Save