parent
b13b2700ab
commit
4622cc7745
31 changed files with 1100 additions and 92 deletions
@ -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) |
||||||
@ -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> |
||||||
|
|
||||||
@ -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> </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> </th> |
||||||
|
<th> </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 %} |
||||||
@ -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="#"><</a> |
||||||
|
<a class="pgpc-next" href="#">></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="#"><</a> |
||||||
|
<a class="pgpc-next" href="#">></a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
Loading…
Reference in new issue