Main KB vews works.

portnov [2008-06-18 04:32:56]
Main KB vews works.
Filename
kb/fields.py
kb/forms.py
kb/models.py
kb/urls.py
kb/views.py
mgmt/models.py
settings.py
templates/create_article.html
templates/edit_article.html
templates/kb.html
templates/kb_article.html
urls.py
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),
ViewGit