diff --git a/kb/fields.py b/kb/fields.py deleted file mode 100644 index 24bc83a..0000000 --- a/kb/fields.py +++ /dev/null @@ -1,81 +0,0 @@ -from os.path import join -import codecs -from md5 import md5 - -from django import oldforms -from django.utils.safestring import mark_safe -from django.utils.html import escape -from django.db import models -from django.conf import settings - -class FileStoredText(object): - def __init__(self,filename=None,text=None): - self.text = text - if filename: - self.read_from(join(settings.TEXTS_PATH,filename)) - - def write_to(self,filename): - f = codecs.open(filename,'w',encoding='utf-8') - f.write(self.text) - f.close() - - def read_from(self,filename): - f = codecs.open(filename,'r',encoding='utf-8') - self.text = f.read() - f.close() - - def digest(self): - return md5(self.text.encode('utf-8')[:50]).hexdigest() - - def __repr__(self): - return "<FileStoredText: %s...>" % self.text[:10] - - def __unicode__(self): - return self.text - -class StoredTextField(oldforms.TextField): - def __init__(self, field_name, rows=10, cols=40, is_required=False, validator_list=None, max_length=None): - if validator_list is None: validator_list = [] - self.field_name = field_name - self.rows, self.cols, self.is_required = rows, cols, is_required - self.validator_list = validator_list[:] - if max_length: - self.validator_list.append(self.isValidLength) - self.max_length = max_length - - def render(self, data): - if data is None: - data = '' - data = FileStoredText(filename=data[4:]).text - return mark_safe(u'<textarea id="%s" class="v%s%s" name="%s" rows="%s" cols="%s">%s</textarea>' % \ - (self.get_id(), self.__class__.__name__, self.is_required and u' required' or u'', - self.field_name, self.rows, self.cols, escape(data))) - -class FileStoredTextField(models.Field): - __metaclass__ = models.SubfieldBase - - def get_manipulator_field_objs(self): - return [StoredTextField] - - def get_internal_type(self): - return "TextField" - - def formfield(self, **kwargs): - defaults = {'widget': forms.Textarea} - defaults.update(kwargs) - return super(FileStoredTextField, self).formfield(**defaults) - - def db_type(self): - return "varchar(64)" - - def to_python(self,value): - if value[:3]=='md5:': - return FileStoredText(filename=value[4:]).text - else: - return value - - def get_db_prep_save(self,value): - fs = FileStoredText(text=value) - filename = fs.digest() - fs.write_to(join(settings.TEXTS_PATH,filename)) - return 'md5:' + filename diff --git a/kb/forms.py b/kb/forms.py new file mode 100644 index 0000000..33acb0b --- /dev/null +++ b/kb/forms.py @@ -0,0 +1,7 @@ +from django import newforms as forms +from models import * + +class ArticleForm(forms.ModelForm): + class Meta: + model = KBArticle + exclude = ('created','author') diff --git a/kb/models.py b/kb/models.py index f6013e5..e7fcb8b 100644 --- a/kb/models.py +++ b/kb/models.py @@ -6,8 +6,6 @@ from django.utils.translation import activate # activate(settings.LANGUAGE_CODE) # _ = lambda s: s -from fields import * - class KBSection(models.Model): title = models.CharField(max_length=128,verbose_name=_("Section")) description = models.TextField(_("Description")) @@ -25,7 +23,7 @@ class KBArticle(models.Model): created = models.DateTimeField(_("Created")) section = models.ForeignKey(KBSection,verbose_name=_("Section")) title = models.CharField(max_length=128,verbose_name=_("Title")) - text = FileStoredTextField() + text = models.TextField() def __unicode__(self): return self.title class Meta: diff --git a/kb/urls.py b/kb/urls.py new file mode 100644 index 0000000..18802aa --- /dev/null +++ b/kb/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('', + (r'^$', 'kb.views.kb_main'), + (r'create/$', 'kb.views.create_article'), + (r'article/(\d+)/$', 'kb.views.one_article'), + (r'article/(\d+)/edit/$', 'kb.views.edit_article'), +) diff --git a/kb/views.py b/kb/views.py index 60f00ef..d3348f9 100644 --- a/kb/views.py +++ b/kb/views.py @@ -1 +1,56 @@ -# Create your views here. +from os.path import dirname +import sys +sys.path.append(dirname(dirname(__file__))) + +from datetime import datetime +from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse + +from mgmt.decorators import render_to,login_required +from models import * +from forms import * + +@login_required +@render_to('kb.html') +def kb_main(request): + sects = KBSection.objects.select_related().all() + return {'sections': sects} + +@login_required +@render_to('kb_article.html') +def one_article(request,id): + article = KBArticle.objects.get(pk=id) + return {'article': article} + +@login_required +@render_to('create_article.html') +def create_article(request): + if request.method == 'POST': + form = ArticleForm(request.POST) + if form.is_valid(): + article = form.save(commit=False) + article.created = datetime.now() + article.author = request.user + article.save() + return HttpResponseRedirect(reverse('kb.views.kb_main')) + else: + return {'form': form} + else: + form = ArticleForm() + return {'form': form} + +@login_required +@render_to('edit_article.html') +def edit_article(request,id): + article = KBArticle.objects.get(pk=id) + if request.method == 'POST': + form = ArticleForm(request.POST,instance=article) + if form.is_valid(): + form.save() + return HttpResponseRedirect(reverse('kb.views.one_article',args=(id,))) + else: + return {'article': article, 'form': form} + form = ArticleForm(instance=article) + return {'article': article, 'form': form} + + diff --git a/mgmt/models.py b/mgmt/models.py index 09ee3d1..d274a5f 100644 --- a/mgmt/models.py +++ b/mgmt/models.py @@ -6,7 +6,7 @@ from django.conf import settings from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ from django.utils.translation import activate -activate(settings.LANGUAGE_CODE) +# activate(settings.LANGUAGE_CODE) # _ = lambda s: s class Object(models.Model): diff --git a/settings.py b/settings.py index 876ae41..b0f4d59 100644 --- a/settings.py +++ b/settings.py @@ -90,8 +90,6 @@ INSTALLED_APPS = ( 'kb', ) -TEXTS_PATH = "/home/portnov/www/projects/media/texts/" - SHOW_BLOCKS = dict( last_comments = dict(), login = dict(hide='/login/$',show_logged=False)) @@ -116,7 +114,8 @@ MENU_ANONYMOUS = [(u'Главная','/'), MENU_USER = [(u'Главная','/'), (u'Моя страница', '/my'), - (u'Git', '/git'), + (u'Git', '/git/'), + (u'KB', '/kb/'), (u'Выход', '/logout/')] REPOS = ['/home/portnov/www/projects', diff --git a/templates/create_article.html b/templates/create_article.html new file mode 100644 index 0000000..eb9888b --- /dev/null +++ b/templates/create_article.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} +{% load prj_filters %} + +{% block title %}Создать статью KB{% endblock %} + +{% block main %} +<h2>Создать статью KB</h2> +{% form form %} +{% endblock %} diff --git a/templates/edit_article.html b/templates/edit_article.html new file mode 100644 index 0000000..5faac0e --- /dev/null +++ b/templates/edit_article.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% load prj_filters %} + +{% block title %}Редактировать статью KB #{{article.id}}: {{article.title}}{% endblock %} + +{% block main %} +<div class='links'> + <a href='{% url kb.views.one_article article.id %}'>Просмотреть</a> +</div> +<h2>Редактировать статью KB #{{article.id}}: {{article.title}}</h2> + +{% form form %} + +{% endblock %} diff --git a/templates/kb.html b/templates/kb.html new file mode 100644 index 0000000..192ae5c --- /dev/null +++ b/templates/kb.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} + +{% block title %}База знаний{% endblock %} + +{% block main %} +<h2>База знаний</h2> + +<p><a href='{% url kb.views.create_article %}'>Создать статью</a></p> + +{% for section in sections %} + {% if section.kbarticle_set.count %} + <h3>{{section.title}}</h3> + <ul> + {% for article in section.kbarticle_set.all %} + <li><a href='{% url kb.views.one_article article.id %}'>{{article.title}}</a></li> + {% endfor %} + </ul> + {% endif %} +{% endfor %} + +<p><a href='{% url kb.views.create_article %}'>Создать статью</a></p> + +{% endblock %} diff --git a/templates/kb_article.html b/templates/kb_article.html new file mode 100644 index 0000000..58ea852 --- /dev/null +++ b/templates/kb_article.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% load prj_filters %} + +{% block title %}Статья KB #{{article.id}}: {{article.title}}{% endblock %} + +{% block main %} +<div class='links'> + <a href='{% url kb.views.edit_article article.id %}'>Изменить</a> +</div> +<h2>Статья KB #{{article.id}}: {{article.title}}</h2> + +<p><strong>Автор:</strong> <a href='{% url mgmt.views.user_page article.author.username %}'>{{article.author.username}}</a></p> + +{{article.text|markdown|safe}} + +{% endblock %} + diff --git a/urls.py b/urls.py index 859abc3..7b538dd 100644 --- a/urls.py +++ b/urls.py @@ -35,7 +35,8 @@ urlpatterns = patterns('', (r'^comments/feed/$', 'mgmt.views.last_comments'), (r'^my/$', 'mgmt.views.my_page'), - (r'git/', include('pygit.urls')), + (r'^git/', include('pygit.urls')), + (r'^kb/', include('kb.urls')), (r'^login/', login), (r'^logout/', logout),