diff --git a/knowledge/forms.py b/knowledge/forms.py index 09dfd19..86cc763 100644 --- a/knowledge/forms.py +++ b/knowledge/forms.py @@ -1,10 +1,13 @@ from django import forms from django.utils.translation import ugettext_lazy as _ -from knowledge import settings -from knowledge.models import Question, Response +import settings +from models import Question, Response, Category +from widgets import CustomRelatedFieldWidgetWrapper +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.core.urlresolvers import reverse -OPTIONAL_FIELDS = ['alert', 'phone_number'] +OPTIONAL_FIELDS = ['alert', 'phone_number', 'categories'] __todo__ = """ @@ -26,7 +29,7 @@ def QuestionForm(user, *args, **kwargs): else: selected_fields = ['name', 'email', 'title', 'body'] else: - selected_fields = ['user', 'title', 'body', 'status'] + selected_fields = ['user', 'title', 'body', 'status', 'categories'] if settings.ALERTS: selected_fields += ['alert'] @@ -54,6 +57,14 @@ def __init__(self, *args, **kwargs): if qf: qf.widget = qf.hidden_widget() qf.required = False + + #Not sure about 'category' or 'category_create' + self.fields['categories'].widget = CustomRelatedFieldWidgetWrapper( + FilteredSelectMultiple(('category'),False,), + reverse('admin:knowledge_category_add'), + True) + + self.fields['categories'].queryset = Category.objects.all() # honey pot! phone_number = forms.CharField(required=False) diff --git a/knowledge/migrations/0004_auto__chg_field_question_body__chg_field_question_user__chg_field_resp.py b/knowledge/migrations/0004_auto__chg_field_question_body__chg_field_question_user__chg_field_resp.py new file mode 100644 index 0000000..27fba9c --- /dev/null +++ b/knowledge/migrations/0004_auto__chg_field_question_body__chg_field_question_user__chg_field_resp.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Question.body' + db.alter_column(u'knowledge_question', 'body', self.gf('mezzanine.core.fields.RichTextField')(null=True)) + + # Changing field 'Question.user' + db.alter_column(u'knowledge_question', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)) + + # Changing field 'Response.user' + db.alter_column(u'knowledge_response', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)) + + def backwards(self, orm): + + # Changing field 'Question.body' + db.alter_column(u'knowledge_question', 'body', self.gf('django.db.models.fields.TextField')(null=True)) + + # Changing field 'Question.user' + db.alter_column(u'knowledge_question', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[user_model_label], null=True)) + + # Changing field 'Response.user' + db.alter_column(u'knowledge_response', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[user_model_label], null=True)) + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'knowledge.category': { + 'Meta': {'ordering': "['title']", 'object_name': 'Category'}, + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchanged': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'knowledge.question': { + 'Meta': {'ordering': "['-added']", 'object_name': 'Question'}, + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'alert': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'body': ('mezzanine.core.fields.RichTextField', [], {'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['knowledge.Category']", 'symmetrical': 'False', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchanged': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'private'", 'max_length': '32', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + u'knowledge.response': { + 'Meta': {'ordering': "['added']", 'object_name': 'Response'}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'alert': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchanged': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'responses'", 'to': u"orm['knowledge.Question']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'inherit'", 'max_length': '32', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) + } + } + + complete_apps = ['knowledge'] \ No newline at end of file diff --git a/knowledge/migrations/0005_auto__chg_field_response_body.py b/knowledge/migrations/0005_auto__chg_field_response_body.py new file mode 100644 index 0000000..5fad1c5 --- /dev/null +++ b/knowledge/migrations/0005_auto__chg_field_response_body.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Response.body' + db.alter_column(u'knowledge_response', 'body', self.gf('mezzanine.core.fields.RichTextField')(null=True)) + + def backwards(self, orm): + + # Changing field 'Response.body' + db.alter_column(u'knowledge_response', 'body', self.gf('django.db.models.fields.TextField')(null=True)) + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'knowledge.category': { + 'Meta': {'ordering': "['title']", 'object_name': 'Category'}, + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchanged': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'knowledge.question': { + 'Meta': {'ordering': "['-added']", 'object_name': 'Question'}, + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'alert': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'body': ('mezzanine.core.fields.RichTextField', [], {'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['knowledge.Category']", 'symmetrical': 'False', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchanged': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'private'", 'max_length': '32', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + }, + u'knowledge.response': { + 'Meta': {'ordering': "['added']", 'object_name': 'Response'}, + 'accepted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'alert': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'body': ('mezzanine.core.fields.RichTextField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'lastchanged': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'responses'", 'to': u"orm['knowledge.Question']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'inherit'", 'max_length': '32', 'db_index': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + } + } + + complete_apps = ['knowledge'] \ No newline at end of file diff --git a/knowledge/models.py b/knowledge/models.py index 1e58676..27115b5 100644 --- a/knowledge/models.py +++ b/knowledge/models.py @@ -8,6 +8,8 @@ from knowledge.managers import QuestionManager, ResponseManager from knowledge.signals import knowledge_post_save +from mezzanine.core.fields import RichTextField + STATUSES = ( ('public', _('Public')), ('private', _('Private')), @@ -45,7 +47,7 @@ class KnowledgeBase(models.Model): added = models.DateTimeField(auto_now_add=True) lastchanged = models.DateTimeField(auto_now=True) - user = models.ForeignKey('auth.User' if django.VERSION < (1, 5, 0) else django_settings.AUTH_USER_MODEL, blank=True, + user = models.ForeignKey('auth.User' if django.VERSION < (1, 5, 0) else django_settings.AUTH_USER_MODEL, blank=False, null=True, db_index=True) alert = models.BooleanField(default=settings.ALERTS, verbose_name=_('Alert'), @@ -150,9 +152,9 @@ class Question(KnowledgeBase): title = models.CharField(max_length=255, verbose_name=_('Question'), help_text=_('Enter your question or suggestion.')) - body = models.TextField(blank=True, null=True, + body = RichTextField(blank=True, null=True, verbose_name=_('Description'), - help_text=_('Please offer details. Markdown enabled.')) + help_text=_('Please offer details.')) status = models.CharField( verbose_name=_('Status'), @@ -254,9 +256,9 @@ class Response(KnowledgeBase): question = models.ForeignKey('knowledge.Question', related_name='responses') - body = models.TextField(blank=True, null=True, + body = RichTextField(blank=True, null=True, verbose_name=_('Response'), - help_text=_('Please enter your response. Markdown enabled.')) + help_text=_('Please enter your response.')) status = models.CharField( verbose_name=_('Status'), max_length=32, choices=STATUSES_EXTENDED, diff --git a/knowledge/static/knowledge/css/main.css b/knowledge/static/knowledge/css/main.css index 7591a0a..641e843 100644 --- a/knowledge/static/knowledge/css/main.css +++ b/knowledge/static/knowledge/css/main.css @@ -3,6 +3,8 @@ font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; } .dk-inner input { margin: 0; } + .dk-inner .dk-content .dk-widget form.dk-form .field-wrapper .field-input span.mceEditor table.mceLayout { + width: 100% !important; } .dk-inner .quiet { font-weight: normal; color: #888; } @@ -36,7 +38,7 @@ border: 1px solid #ccc; font-size: 16px; width: 87%; - height: 16px; + /*height: 16px;*/ float: left; } .dk-inner .dk-search .submit-question-search { height: 34px; @@ -90,8 +92,8 @@ margin-bottom: 1em; } .dk-inner .dk-content .dk-widget img { max-width: 96%; - padding: 1%; - border: 1px solid #ccc; } + /*padding: 1%; + border: 1px solid #ccc;*/ } .dk-inner .dk-content .dk-widget ol.question-list { font-size: 14px; margin-left: 10px; } diff --git a/knowledge/templates/django_knowledge/list.html b/knowledge/templates/django_knowledge/list.html index be19f36..656e181 100644 --- a/knowledge/templates/django_knowledge/list.html +++ b/knowledge/templates/django_knowledge/list.html @@ -29,7 +29,7 @@