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