1322: Этап №3 - Статьи

part 2,3,4 done
part 1/2 done
remotes/origin/search
Alexander Burdeiny 10 years ago
parent 4cfb81fa5d
commit 656d943d28
  1. 2
      article/managers.py
  2. 7
      exposition/forms.py
  3. 11
      templates/admin/theme/theme_add.html
  4. 2
      theme/admin.py
  5. 25
      theme/forms.py
  6. 177
      theme/migrations/0001_initial.py
  7. 82
      theme/migrations/0002_auto__add_field_theme_blogtheme_linking.py
  8. 0
      theme/migrations/__init__.py
  9. 35
      theme/models.py

@ -47,6 +47,6 @@ class ArticleManager(TranslationManager):
cached_blogs = cache.get(key)
return cached_blogs
else:
blogs = list(self.blogs().filter(publish_date__isnull=False).order_by('-main_page', '-publish_date')[:3])
blogs = list(self.blogs().filter(publish_date__isnull=False).order_by('-publish_date')[:3])
cache.set(key, blogs, self.cache_time)
return blogs

@ -49,8 +49,9 @@ class ExpositionCreateForm(forms.Form):
#company = forms.MultipleChoiceField(label=u'Компании', required=False,
# choices=[(item.id, item.name) for item in Company.objects.language().all()] )
country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()])
theme = forms.MultipleChoiceField(label='Тематики',
choices=[(item.id, item.name) for item in Theme.objects.language().all()])
theme = forms.MultipleChoiceField(
label='Тематики',
choices=[(item.id, item.name) for item in Theme.objects.language().filter(types=Theme.types.exposition)])
place = forms.ChoiceField(label=u'Место проведения', required=False,
choices=places)
place_alt = forms.CharField(required=False, label=u'Альтернативное место')
@ -617,4 +618,4 @@ class ExpositionFilterForm(AdminFilterForm):
if month:
qs = qs.filter(data_begin__month=month)
return qs
return qs

@ -35,6 +35,15 @@
<span class="help-inline">{{ form.types.errors }}</span>
</div>
</div>
{# blogtheme_linking #}
<div class="control-group {% if form.blogtheme_linking.errors %}error{% endif %}">
<label class="control-label">{{ form.blogtheme_linking.label }}:</label>
<div class="controls">
{{ form.blogtheme_linking }}
<span class="help-inline">{{ form.blogtheme_linking.errors }}</span>
<p class="text-primary">{{ form.blogtheme_linking.help_text }} </p>
</div>
</div>
{# main_title #}
{% with field='main_title' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
@ -67,4 +76,4 @@
</fieldset>
</form>
{% endblock %}
{% endblock %}

@ -86,7 +86,7 @@ def theme_change(request, theme_id=None):
data = {}
#bitfeild
data['types'] = [item for item, bool in theme.types if bool==True]
data['blogtheme_linking'] = theme.blogtheme_linking
#data from translated fields

@ -1,22 +1,24 @@
# -*- coding: utf-8 -*-
from django import forms
from models import Tag, Theme
from bitfield.types import BitHandler
from bitfield import BitField
from bitfield.forms import BitFieldCheckboxSelectMultiple, BitFormField
from django.conf import settings
from bitfield.types import BitHandler
from ckeditor.widgets import CKEditorWidget
from functions.translate import fill_with_signal
from django import forms
from django.conf import settings
from functions.admin_forms import AdminFilterForm
from functions.form_check import translit_with_separator
from functions.translate import fill_with_signal
from hvad.forms import TranslatableModelForm
from .models import Tag, Theme, ThemeBlog
class ThemeForm(forms.Form):
types = forms.MultipleChoiceField(label='Тип', required=False, choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple())
blogtheme_linking = forms.ModelChoiceField(
label=u'тема для блога', queryset=ThemeBlog.objects.all(), cache_choices=True, required=False,
help_text=u'''Выберите тему для блога, которая будет заменена на текущую тему.'''
u''' После миграции данных это поле будет удалено, а у всех статей у которых указана выбранная тема, будет заменена на текущую.''')
def __init__(self, *args, **kwargs):
super(ThemeForm, self).__init__(*args, **kwargs)
@ -58,8 +60,10 @@ class ThemeForm(forms.Form):
#generates bitfield
flag = reduce(lambda x,y: x|y, (getattr(Theme.types, item) for item in data['types']))
theme.types = flag
theme.blogtheme_linking = data['blogtheme_linking']
#theme.save()
if theme.pk and theme.url:
theme.save()
fill_with_signal(Theme, theme, data)
if not theme.url:
@ -145,9 +149,6 @@ class ThemeFilterForm(AdminFilterForm):
class TagFilterForm(AdminFilterForm):
model = Tag
from hvad.forms import TranslatableModelForm
from .models import ThemeBlog
class _ThemeBlogForm(TranslatableModelForm):
class Meta:

@ -0,0 +1,177 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'ThemeTranslation'
db.create_table(u'theme_theme_translation', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('main_title', self.gf('django.db.models.fields.CharField')(max_length=255)),
('description', self.gf('django.db.models.fields.TextField')(blank=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('descriptions', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('keywords', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['theme.Theme'])),
))
db.send_create_signal(u'theme', ['ThemeTranslation'])
# Adding unique constraint on 'ThemeTranslation', fields ['language_code', 'master']
db.create_unique(u'theme_theme_translation', ['language_code', 'master_id'])
# Adding model 'Theme'
db.create_table(u'theme_theme', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('url', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255)),
('old_url', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255)),
('types', self.gf('django.db.models.fields.BigIntegerField')(default=None)),
('main_page', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, db_index=True)),
('inflect', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
))
db.send_create_signal(u'theme', ['Theme'])
# Adding model 'ThemeBlogTranslation'
db.create_table(u'theme_themeblog_translation', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
('main_title', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('description', self.gf('django.db.models.fields.TextField')(blank=True)),
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['theme.ThemeBlog'])),
))
db.send_create_signal(u'theme', ['ThemeBlogTranslation'])
# Adding unique constraint on 'ThemeBlogTranslation', fields ['language_code', 'master']
db.create_unique(u'theme_themeblog_translation', ['language_code', 'master_id'])
# Adding model 'ThemeBlog'
db.create_table(u'theme_themeblog', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('url', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255)),
('inflect', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
))
db.send_create_signal(u'theme', ['ThemeBlog'])
# Adding model 'TagTranslation'
db.create_table(u'theme_tag_translation', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('main_title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('description', self.gf('django.db.models.fields.TextField')(blank=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=250, blank=True)),
('descriptions', self.gf('django.db.models.fields.CharField')(max_length=250, blank=True)),
('keywords', self.gf('django.db.models.fields.CharField')(max_length=250, blank=True)),
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['theme.Tag'])),
))
db.send_create_signal(u'theme', ['TagTranslation'])
# Adding unique constraint on 'TagTranslation', fields ['language_code', 'master']
db.create_unique(u'theme_tag_translation', ['language_code', 'master_id'])
# Adding model 'Tag'
db.create_table(u'theme_tag', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('url', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255)),
('old_url', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255)),
('theme', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tags', on_delete=models.PROTECT, to=orm['theme.Theme'])),
('inflect', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
))
db.send_create_signal(u'theme', ['Tag'])
def backwards(self, orm):
# Removing unique constraint on 'TagTranslation', fields ['language_code', 'master']
db.delete_unique(u'theme_tag_translation', ['language_code', 'master_id'])
# Removing unique constraint on 'ThemeBlogTranslation', fields ['language_code', 'master']
db.delete_unique(u'theme_themeblog_translation', ['language_code', 'master_id'])
# Removing unique constraint on 'ThemeTranslation', fields ['language_code', 'master']
db.delete_unique(u'theme_theme_translation', ['language_code', 'master_id'])
# Deleting model 'ThemeTranslation'
db.delete_table(u'theme_theme_translation')
# Deleting model 'Theme'
db.delete_table(u'theme_theme')
# Deleting model 'ThemeBlogTranslation'
db.delete_table(u'theme_themeblog_translation')
# Deleting model 'ThemeBlog'
db.delete_table(u'theme_themeblog')
# Deleting model 'TagTranslation'
db.delete_table(u'theme_tag_translation')
# Deleting model 'Tag'
db.delete_table(u'theme_tag')
models = {
u'theme.tag': {
'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.tagtranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TagTranslation', 'db_table': "u'theme_tag_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Tag']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
},
u'theme.theme': {
'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.themeblog': {
'Meta': {'unique_together': '()', 'object_name': 'ThemeBlog', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.themeblogtranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeBlogTranslation', 'db_table': "u'theme_themeblog_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.ThemeBlog']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
u'theme.themetranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeTranslation', 'db_table': "u'theme_theme_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keywords': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Theme']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
}
}
complete_apps = ['theme']

@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'Theme.blogtheme_linking'
db.add_column(u'theme_theme', 'blogtheme_linking',
self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['theme.ThemeBlog'], null=True),
keep_default=False)
def backwards(self, orm):
# Deleting field 'Theme.blogtheme_linking'
db.delete_column(u'theme_theme', 'blogtheme_linking_id')
models = {
u'theme.tag': {
'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.tagtranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TagTranslation', 'db_table': "u'theme_tag_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Tag']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
},
u'theme.theme': {
'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'},
'blogtheme_linking': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['theme.ThemeBlog']", 'null': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.themeblog': {
'Meta': {'unique_together': '()', 'object_name': 'ThemeBlog', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.themeblogtranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeBlogTranslation', 'db_table': "u'theme_themeblog_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.ThemeBlog']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
u'theme.themetranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeTranslation', 'db_table': "u'theme_theme_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keywords': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Theme']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
}
}
complete_apps = ['theme']

@ -1,17 +1,23 @@
# -*- coding: utf-8 -*-
import datetime
import copy
from django.db import models
import datetime
import random
import string
from bitfield import BitField
from conference.models import Conference
from django.db import IntegrityError, models
from django.db.models.signals import post_save, pre_save
from django.utils import translation
from django.utils.translation import ugettext as _
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from bitfield import BitField
from exposition.models import Exposition
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
from functions.form_check import translit_with_separator
from functions.models_methods import ExpoManager
from functions.signal_handlers import post_save_handler
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from manager import TagActiveManager, ThemeActiveManager
from seminar.models import Seminar
from webinar.models import Webinar
class Theme(TranslatableModel):
@ -32,10 +38,13 @@ class Theme(TranslatableModel):
('conference', 'Конференция'),
('seminar', 'Семинар'),
('webinar', 'Вебинар'),
('article', 'Статья'),
)
url = models.SlugField(unique=True, max_length=255)
old_url = models.SlugField(unique=True, max_length=255)
types = BitField([k for k, v in FLAGS])
blogtheme_linking = models.ForeignKey('ThemeBlog', verbose_name=u'тема для блога', null=True, default=None,
help_text=u'Выберите тему для блога, которая будет заменена на текущую тему')
#translated fields
translations = TranslatedFields(
name = models.CharField(max_length=255),
@ -156,7 +165,6 @@ class ThemeBlog(TranslatableModel):
return ' '.join(self.get_all_names())
from django.db import IntegrityError
class Tag(TranslatableModel):
"""
Create Tag model
@ -243,15 +251,6 @@ class Tag(TranslatableModel):
return parent
from django.db.models.signals import post_save, pre_save
from functions.signal_handlers import post_save_handler
from functions.form_check import translit_with_separator
import random, string
def pre_save_handler(sender, **kwargs):
obj = kwargs['instance']
@ -277,5 +276,3 @@ post_save.connect(post_save_handler, sender=Tag)
#-----------------------

Loading…
Cancel
Save