# -*- coding: utf-8 -*- from django.shortcuts import render_to_response, get_object_or_404 from django.http import HttpResponseRedirect from django.core.context_processors import csrf from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib.contenttypes.models import ContentType from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage #models and forms from forms import ArticleForm, Article, ArticleChangeForm from theme.models import Tag from file.models import FileModel, TmpFile from file.forms import FileModelForm #pythom import random @login_required def article_add(request): """ Return form of article and post it on the server. If form is posted redirect on the page of all articles. """ #if form would be not valid key must be same if request.POST.get('key'): key = request.POST['key'] else: key = random.getrandbits(128) file_form = FileModelForm(initial={'key': key}) if request.POST: form = ArticleForm(request.POST) #set choices filled by ajax form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] if form.is_valid(): form.save() return HttpResponseRedirect('/article/all') else: form = ArticleForm(initial={'key': key}) args = {} args.update(csrf(request)) args['form'] = form args['languages'] = settings.LANGUAGES args['file_form'] = file_form args['files'] = TmpFile.objects.filter(key=key) return render_to_response('article_add.html', args) @login_required def article_all(request): """ Return list of all articles with pagination """ article_list = Article.objects.all() paginator = Paginator(article_list, 1)#show 10 items per page page = request.GET.get('page') try: articles = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. articles = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. articles = paginator.page(paginator._num_pages) return render_to_response('article_all.html', {'articles': articles}) def article_change(request, url): """ Return form and fill it with existing Article object data. If form is posted redirect on the page of all articles. """ try: #check if article_id exists else redirect to the list of cities article = Article.objects.get(url=url) file_form = FileModelForm(initial={'model': 'article.Article'}) except: return HttpResponseRedirect('/article/all') if request.POST: form = ArticleChangeForm(request.POST) #set choices filled by ajax form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] if form.is_valid(): form.save(getattr(article, 'id')) return HttpResponseRedirect('/article/all') else: data = {} #fill form with data from database data['author'] = article.author data['theme'] = [item.id for item in article.theme.all()] data['tag'] = [item.id for item in article.tag.all()] #data from translated fields for code, name in settings.LANGUAGES: obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields data['main_title_%s' % code] = obj.main_title data['preview_%s' % code] = obj.preview data['description_%s' % code] = obj.description data['title_%s' % code] = obj.title data['keywords_%s' % code] = obj.keywords data['descriptions_%s' % code] = obj.descriptions #fill form form = ArticleChangeForm(initial=data) #set choices filled by ajax form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] args = {} args.update(csrf(request)) args['form'] = form args['languages'] = settings.LANGUAGES args['file_form'] = file_form #get list of files which connected with specific model object args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id')) args['obj_id'] = getattr(article, 'id') return render_to_response('article_add.html', args)