- •На курсовий проект (роботу) студента
- •Календарний план
- •Введение
- •1 Постановка задачи
- •1.1 Описание предметной области
- •1.2 Цели и задачи курсового проектирования
- •1.3 Выбор средств реализации
- •2 Предметная область
- •2.1 Описание предметной области
- •2.2 Словарь предметной области
- •2.3 Объектно-ориентированный словарь предметной области
- •3 Проектирование аис
- •3.1 Диаграмма вариантов использования
- •3.2 Диаграмма классов
- •3.3 Диаграмма состояний
- •3.4 Диаграмма активности
- •3.5 Диаграмма взаимодействия
- •3.5.1 Диаграмма последовательности действий
- •3.5.2 Диаграмма сотрудничества
- •3.6 Диаграмма компонент
- •Список литературы
- •Приложение а. Техническое задание
- •Приложение б. Листинг программных модулей
Приложение б. Листинг программных модулей
Файл: 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)
