parent
dd252beb3a
commit
fb38c10115
14 changed files with 325 additions and 2 deletions
@ -0,0 +1,73 @@ |
||||
{% extends 'base.jinja' %} |
||||
{% block title %} |
||||
{{ object.title }} > Акции Батискаф-Казахстан |
||||
{% endblock %} |
||||
{% block meta_description %} |
||||
{{ object.title }} - Акции Батискаф-Казахстан. |
||||
{% endblock %} |
||||
{% block meta_keywords %} |
||||
Акции, Читать, Комментировать, {{ object.title }}, Батискаф-Казахстан |
||||
{% endblock %} |
||||
{% block content %} |
||||
<div class=" breadcrumbs"> |
||||
<ol class="breadcrumb breadcrumb-arrow"> |
||||
<li><a href="/">Главная</a></li> |
||||
<li><a href="/news/">Акции</a></li> |
||||
<li class="active"><span>{{ object.title }}</span></li> |
||||
|
||||
</ol> |
||||
</div> |
||||
<h2 class="text-left"> |
||||
{% if object.get_status() == 0 %} |
||||
{{ object.title }} <small><span class="text-muted">Акция еще не началась</span></small> |
||||
|
||||
{% elif object.get_status() == 1 %} |
||||
{{ object.title }} <small><span class="text-success">Действующая акция</span></small> |
||||
{% else %} |
||||
<s>{{ object.title }}</s> <small><span class="text-danger">Акция завершена</span></small> |
||||
{% endif %} |
||||
|
||||
|
||||
</h2> |
||||
|
||||
<br/> |
||||
<div class="well well-lg news-container"> |
||||
|
||||
<p class="text-muted"> |
||||
<small> |
||||
<span class="glyphicon glyphicon-time" |
||||
aria-hidden="true"></span> {{ object.created.strftime('%d.%m.%Y') }} |
||||
|
||||
</small> |
||||
</p> |
||||
|
||||
<p class="text-center"> |
||||
{% set im = object.image %} |
||||
<img src="/static/{{ im.url }}" alt="{{ object.title }}" title="{{ object.title }}" style="max-width: 100%" class=""/> |
||||
</p> |
||||
{{ object.text|linebreaks|safe }} |
||||
|
||||
<hr/> |
||||
<div class="row"> |
||||
|
||||
|
||||
<div class="tags col-xs-6"> |
||||
<h5 class="text-left"> |
||||
Поделиться ссылкой:</h5> |
||||
|
||||
<script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script> |
||||
<div class="yashare-auto-init" data-yashareL10n="ru" data-yashareType="small" |
||||
data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" |
||||
data-yashareLink="http://batiskaf-kz.kz{{ object.get_absolute_url() }}" |
||||
data-yashareTitle="{{ object.title }}" data-yashareTheme="counter"></div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
|
||||
|
||||
</div> |
||||
|
||||
{% endblock %} |
||||
|
||||
@ -0,0 +1,79 @@ |
||||
{% extends 'base.jinja' %} |
||||
{% block title %} |
||||
Акции Батискаф-Казахстан |
||||
{% endblock %} |
||||
{% block meta_description %} |
||||
Акции интернет-магазина подводной охоты и дайвинга Батискаф-Казахстан |
||||
{% endblock %} |
||||
{% block meta_keywords %} |
||||
Акции, Читать, Комментировать, Снаряжение, Батискаф-Казахстан |
||||
{% endblock %} |
||||
{% block content %} |
||||
<div class=" breadcrumbs"> |
||||
<ol class="breadcrumb breadcrumb-arrow"> |
||||
<li><a href="/">Главная</a></li> |
||||
<li class="active"><span>Акции</span></li> |
||||
</ol> |
||||
</div> |
||||
<script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script> |
||||
|
||||
{% if object_list %} |
||||
|
||||
|
||||
|
||||
{% for object in object_list %} |
||||
<div class="well well-lg news-container"> |
||||
<h2 class="text-left"> |
||||
{% if object.get_status() == 0 %} |
||||
<a href="{{ url('promo_detail', args=(object.slug,)) }}">{{ object.title }}</a> <small><span class="text-muted">Акция еще не началась</span></small> |
||||
|
||||
{% elif object.get_status() == 1 %} |
||||
<a href="{{ url('promo_detail', args=(object.slug,)) }}">{{ object.title }}</a> <small><span class="text-success">Действующая акция</span></small> |
||||
{% else %} |
||||
<s><a href="{{ url('promo_detail', args=(object.slug,)) }}">{{ object.title }}</a></s> <small><span class="text-danger">Акция завершена</span></small> |
||||
{% endif %} |
||||
|
||||
|
||||
</h2> |
||||
|
||||
<p class="text-muted"> |
||||
<small> |
||||
Акция действует с <strong>{{ object.act_from.strftime('%d.%m.%Y') }}</strong> до <strong>{{ object.act_to.strftime('%d.%m.%Y') }}</strong> |
||||
</small> |
||||
</p> |
||||
<p class="text-center"> |
||||
{# {% set im = object.image|thumbnail("400x400") %}#} |
||||
<a href="{{ url('promo_detail', args=(object.slug,)) }}"><img src="/static/{{ object.image.url }}" |
||||
alt="{{ object.title }}" |
||||
title="{{ object.title }}" |
||||
style="max-width: 100%"/></a> |
||||
</p> |
||||
{{ object.text|truncate(520)|linebreaks|safe }} |
||||
<p class="text-right"><a href="{{ url('promo_detail', args=(object.slug,)) }}">Продолжить читать →</a> |
||||
</p> |
||||
<hr/> |
||||
<div class="social-links"> |
||||
<strong> |
||||
Поделиться ссылкой: |
||||
|
||||
<div class="yashare-auto-init" data-yashareL10n="ru" data-yashareType="small" |
||||
data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" |
||||
data-yashareLink="http://batiskaf-kz.kz{{ object.get_absolute_url() }}" |
||||
data-yashareTitle="{{ object.title }}" data-yashareTheme="counter"></div> |
||||
</strong> |
||||
</div> |
||||
</div> |
||||
{% endfor %} |
||||
{% else %} |
||||
<div class="alert alert-warning alert-dismissable"> |
||||
<h4>Пока не проводится ни одной акции</h4> |
||||
|
||||
<p>Пожалуйста, зайдите в этот раздел позже.</p> |
||||
|
||||
<p><a class="btn btn-warning" href="/">Перейти на главную страницу</a> |
||||
</p> |
||||
</div> |
||||
{% endif %} |
||||
|
||||
{% endblock %} |
||||
|
||||
@ -0,0 +1,12 @@ |
||||
from django.contrib import admin |
||||
from .models import * |
||||
|
||||
|
||||
@admin.register(Promo) |
||||
class PromoAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'is_public', 'act_from', 'act_to') |
||||
prepopulated_fields = {"slug": ("title",)} |
||||
list_editable = ('is_public',) |
||||
list_filter = ('is_public',) |
||||
|
||||
|
||||
@ -0,0 +1,32 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import models, migrations |
||||
import promo.models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Promo', |
||||
fields=[ |
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), |
||||
('created', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время')), |
||||
('act_from', models.DateTimeField(verbose_name='От')), |
||||
('act_to', models.DateTimeField(verbose_name='До')), |
||||
('title', models.CharField(max_length=512, verbose_name='Заголовок', unique=True)), |
||||
('slug', models.SlugField(max_length=512, verbose_name='Ссылка', unique=True)), |
||||
('text', models.TextField(verbose_name='Акция')), |
||||
('is_public', models.BooleanField(verbose_name='Публиковать', default=True)), |
||||
('image', models.ImageField(verbose_name='Картинка', upload_to=promo.models.photo_filename)), |
||||
], |
||||
options={ |
||||
'verbose_name_plural': 'акции', |
||||
'verbose_name': 'акция', |
||||
}, |
||||
), |
||||
] |
||||
@ -0,0 +1,55 @@ |
||||
from django.core.urlresolvers import reverse |
||||
from django.db import models |
||||
from django.utils import timezone |
||||
|
||||
|
||||
def photo_filename(instance, filename): |
||||
from slugify import slugify_filename |
||||
|
||||
return 'photo_uploads/' + slugify_filename(filename) |
||||
|
||||
|
||||
class Promo(models.Model): |
||||
created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False) |
||||
act_from = models.DateTimeField('От', editable=True) |
||||
act_to = models.DateTimeField('До', editable=True) |
||||
title = models.CharField('Заголовок', max_length=512, null=False, blank=False, unique=True) |
||||
slug = models.SlugField('Ссылка', max_length=512, null=False, blank=False, unique=True) |
||||
text = models.TextField('Акция', null=False, blank=False) |
||||
is_public = models.BooleanField('Публиковать', default=True) |
||||
image = models.ImageField('Картинка', upload_to=photo_filename) |
||||
|
||||
class Meta: |
||||
verbose_name = 'акция' |
||||
verbose_name_plural = 'акции' |
||||
|
||||
def __str__(self): |
||||
return self.title |
||||
|
||||
def get_absolute_url(self): |
||||
return reverse('promo_detail', args=(self.slug,)) |
||||
|
||||
def get_status(self): |
||||
from datetime import datetime |
||||
if datetime.now() < self.act_from: |
||||
return 0 |
||||
elif self.act_from < datetime.now() < self.act_to: |
||||
return 1 |
||||
else: |
||||
return 2 |
||||
|
||||
|
||||
# class NewsComment(models.Model): |
||||
# created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False) |
||||
# name = models.CharField('Имя', max_length=45, null=False, blank=False) |
||||
# email = models.EmailField('Email (не будет опубликован)', null=False, blank=False) |
||||
# text = models.TextField('Комментарий', null=False, blank=False) |
||||
# reply_to = models.ForeignKey('self', null=True, blank=True) |
||||
# news = models.ForeignKey(News, related_name='comments') |
||||
|
||||
# class Meta: |
||||
# verbose_name = 'комментарий' |
||||
# verbose_name_plural = 'комментарии' |
||||
|
||||
# def __str__(self): |
||||
# return '{}: {}'.format(self.name, self.news.title) |
||||
@ -0,0 +1,3 @@ |
||||
from django.test import TestCase |
||||
|
||||
# Create your tests here. |
||||
@ -0,0 +1,9 @@ |
||||
from django.conf.urls import patterns, url |
||||
from django.views.generic import RedirectView |
||||
from .views import * |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^$', PromoList.as_view(), name='promo_index'), |
||||
url(r'^(?P<slug>[-\w]+)/$', |
||||
promo_detail, name='promo_detail'), |
||||
) |
||||
@ -0,0 +1,32 @@ |
||||
from django.contrib import messages |
||||
from django.contrib.sitemaps import Sitemap |
||||
from django.core.mail import mail_managers |
||||
from django.shortcuts import render, get_object_or_404, redirect |
||||
from django.views.generic import ListView, DetailView |
||||
from django.views.generic.edit import FormView, CreateView |
||||
from .models import * |
||||
|
||||
|
||||
class PromoList(ListView): |
||||
model = Promo |
||||
template_name = 'promo/list.jinja' |
||||
queryset = Promo.objects.filter(is_public=True).order_by('-pk') |
||||
|
||||
def promo_detail(request, slug): |
||||
object = get_object_or_404(Promo, slug__iexact=slug, is_public=True) |
||||
|
||||
c = dict( |
||||
object=object, |
||||
) |
||||
return render(request, 'promo/detail.jinja', c) |
||||
|
||||
|
||||
class PromoSitemap(Sitemap): |
||||
changefreq = "never" |
||||
priority = 0.7 |
||||
|
||||
def items(self): |
||||
return Promo.objects.filter(is_public=True) |
||||
|
||||
def lastmod(self, obj): |
||||
return obj.created |
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue