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