Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект по ПИ.docx
Скачиваний:
7
Добавлен:
16.09.2019
Размер:
2 Мб
Скачать
☆

Приложение б. Листинг программных модулей

Файл: url.py

from django.conf.urls.defaults import *

from dbe.forum.models import *

urlpatterns = patterns('dbe.forum.views',

(r"^forum/(\d+)/$", "forum"),

(r"^thread/(\d+)/$", "thread"),

(r"^post/(new_thread|reply)/(\d+)/$", "post"),

(r"^reply/(\d+)/$", "reply"),

(r"^profile/(\d+)/$", "profile"),

(r"^new_thread/(\d+)/$", "new_thread"),

(r"", "main"),

)

Файл: views.py

from string import join

from PIL import Image as PImage

from os.path import join as pjoin

from django.contrib.auth.decorators import login_required

from django.http import HttpResponseRedirect, HttpResponse

from django.shortcuts import get_object_or_404, render_to_response

from django.core.context_processors import csrf

from django.core.paginator import Paginator, InvalidPage, EmptyPage

from django.forms import ModelForm

from django.contrib.auth.models import User

from django.core.urlresolvers import reverse

from dbe.settings import MEDIA_ROOT, MEDIA_URL

from dbe.forum.models import *

class ProfileForm(ModelForm):

class Meta:

model = UserProfile

exclude = ["posts", "user"]

def mk_paginator(request, items, num_items):

"""Create and return a paginator."""

paginator = Paginator(items, num_items)

try: page = int(request.GET.get("page", '1'))

except ValueError: page = 1

try:

items = paginator.page(page)

except (InvalidPage, EmptyPage):

items = paginator.page(paginator.num_pages)

return items

def main(request):

"""Main listing."""

forums = Forum.objects.all()

return render_to_response("forum/list.html", dict(forums=forums, user=request.user))

def forum(request, pk):

"""Listing of threads in a forum."""

threads = Thread.objects.filter(forum=pk).order_by("-created")

threads = mk_paginator(request, threads, 20)

return render_to_response("forum/forum.html", add_csrf(request, threads=threads, pk=pk))

def thread(request, pk):

"""Listing of posts in a thread."""

posts = Post.objects.filter(thread=pk).order_by("created")

posts = mk_paginator(request, posts, 15)

t = Thread.objects.get(pk=pk)

return render_to_response("forum/thread.html", add_csrf(request, posts=posts, pk=pk, title=t.title,

forum_pk=t.forum.pk, media_url=MEDIA_URL))

@login_required

def profile(request, pk):

"""Edit user profile."""

profile = UserProfile.objects.get(user=pk)

img = None

if request.method == "POST":

pf = ProfileForm(request.POST, request.FILES, instance=profile)

if pf.is_valid():

pf.save()

# resize and save image under same filename

imfn = pjoin(MEDIA_ROOT, profile.avatar.name)

im = PImage.open(imfn)

im.thumbnail((160,160), PImage.ANTIALIAS)

im.save(imfn, "JPEG")

else:

pf = ProfileForm(instance=profile)

if profile.avatar:

img = "/media/" + profile.avatar.name

return render_to_response("forum/profile.html", add_csrf(request, pf=pf, img=img))

@login_required

def post(request, ptype, pk):

"""Display a post form."""

action = reverse("dbe.forum.views.%s" % ptype, args=[pk])

if ptype == "new_thread":

title = "Start New Topic"

subject = ''

elif ptype == "reply":

title = "Reply"

subject = "Re: " + Thread.objects.get(pk=pk).title

return render_to_response("forum/post.html", add_csrf(request, subject=subject, action=action,

title=title))

def increment_post_counter(request):

profile = request.user.userprofile_set.all()[0]

profile.posts += 1

profile.save()

@login_required

def new_thread(request, pk):

"""Start a new thread."""

p = request.POST

if p["subject"] and p["body"]:

forum = Forum.objects.get(pk=pk)

thread = Thread.objects.create(forum=forum, title=p["subject"], creator=request.user)

Post.objects.create(thread=thread, title=p["subject"], body=p["body"], creator=request.user)

increment_post_counter(request)

return HttpResponseRedirect(reverse("dbe.forum.views.forum", args=[pk]))

@login_required

def reply(request, pk):

"""Reply to a thread."""

p = request.POST

if p["body"]:

thread = Thread.objects.get(pk=pk)

post = Post.objects.create(thread=thread, title=p["subject"], body=p["body"], creator=request.user)

increment_post_counter(request)

return HttpResponseRedirect(reverse("dbe.forum.views.thread", args=[pk]) + "?page=last")

def add_csrf(request, **kwargs):

"""Add CSRF to dictionary."""

d = dict(user=request.user, **kwargs)

d.update(csrf(request))

return d

Файл: admin.py

from dbe.forum.models import *

from django.contrib import admin

admin.site.register(Forum, ForumAdmin)

admin.site.register(Thread, ThreadAdmin)

admin.site.register(Post, PostAdmin)

admin.site.register(UserProfile, ProfileAdmin)

Файл: models.py

from django.db import models

from django.contrib.auth.models import User

from django.contrib import admin

from django.db.models.signals import post_save

class Forum(models.Model):

title = models.CharField(max_length=60)

def __unicode__(self):

return self.title

def num_posts(self):

return sum([t.num_posts() for t in self.thread_set.all()])

def last_post(self):

if self.thread_set.count():

last = None

for t in self.thread_set.all():

l = t.last_post()

if l:

if not last or l.created > last.created:

last = l

return last

class Thread(models.Model):

title = models.CharField(max_length=60)

created = models.DateTimeField(auto_now_add=True)

creator = models.ForeignKey(User, blank=True, null=True)

forum = models.ForeignKey(Forum)

def __unicode__(self):

return unicode(self.creator) + " - " + self.title

def num_posts(self):

return self.post_set.count()

def num_replies(self):

return self.post_set.count() - 1

def last_post(self):

if self.post_set.count():

return self.post_set.order_by("created")[0]

class Post(models.Model):

title = models.CharField(max_length=60)

created = models.DateTimeField(auto_now_add=True)

creator = models.ForeignKey(User, blank=True, null=True)

thread = models.ForeignKey(Thread)

body = models.TextField(max_length=10000)

def __unicode__(self):

return u"%s - %s - %s" % (self.creator, self.thread, self.title)

def short(self):

return u"%s - %s\n%s" % (self.creator, self.title, self.created.strftime("%b %d, %I:%M %p"))

short.allow_tags = True

def profile_data(self):

p = self.creator.userprofile_set.all()[0]

return p.posts, p.avatar

class UserProfile(models.Model):

avatar = models.ImageField("Profile Pic", upload_to="images/", blank=True, null=True)

posts = models.IntegerField(default=0)

user = models.ForeignKey(User, unique=True)

def __unicode__(self):

return unicode(self.user)

### Admin

class ProfileAdmin(admin.ModelAdmin):

list_display = ["user"]

class ForumAdmin(admin.ModelAdmin):

pass

class ThreadAdmin(admin.ModelAdmin):

list_display = ["title", "forum", "creator", "created"]

list_filter = ["forum", "creator"]

class PostAdmin(admin.ModelAdmin):

search_fields = ["title", "creator"]

list_display = ["title", "thread", "creator", "created"]

def create_user_profile(sender, **kwargs):

"""When creating a new user, make a profile for him."""

u = kwargs["instance"]

if not UserProfile.objects.filter(user=u):

UserProfile(user=u).save()

post_save.connect(create_user_profile, sender=User)