Skip to content

first step in allowing questions to be bound to multiple templates wi… #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 23 additions & 18 deletions projectsheet/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,6 @@
from .models import ProjectSheet, ProjectSheetTemplate, ProjectSheetQuestion, ProjectSheetQuestionAnswer, QuestionChoice


class EditLinkToInlineObject(object):
def edit_link(self, instance):
url = reverse('admin:%s_%s_change' % (
instance._meta.app_label, instance._meta.module_name), args=[instance.pk] )
if instance.pk:
return mark_safe(u'<a href="{u}">edit</a>'.format(u=url))
else:
return ''


# HEADS UP: currently not possible to inherit from
# StackedInline with SimpleHistoryAdmin.
class ProjectSheetQuestionAnswerInline(StackedInline):
Expand All @@ -34,32 +24,47 @@ class QuestionChoiceInline(StackedInline):
readonly_fields = ('value',)


class ProjectSheetQuestionInline(EditLinkToInlineObject, StackedInline):
model = ProjectSheetQuestion
class ProjectSheetQuestionInline(StackedInline):
model = ProjectSheetQuestion.template.through
extra = 0
min_num = 1
readonly_fields = ('get_choices', 'edit_link' )
readonly_fields = ('get_choices', 'edit_questions_link', )

def get_choices(self, obj):
choices_string = ""
for choice in obj.choices.all():
choices_string += choice.text+', '
return choices_string
try:
question_object = ProjectSheetQuestion.objects.get(pk=obj.projectsheetquestion_id)
for choice in question_object.choices.all():
choices_string += choice.text+', '
return choices_string
except Exception as e:
return choices_string

def edit_questions_link(self, instance):
url = reverse('admin:%s_%s_change' % (
instance._meta.app_label, 'projectsheetquestion'), args=[instance.projectsheetquestion_id] )
if instance.projectsheetquestion_id:
return mark_safe(u'<a href="{u}">edit</a>'.format(u=url))
else:
return ''

get_choices.short_description = 'Choix'


class ProjectSheetQuestionAdmin(admin.ModelAdmin):
exclude = ('template', )
inlines = [QuestionChoiceInline]
list_display = [ 'id', 'related_template', '__unicode__']
list_display = [ 'id', '__unicode__']

# FIXME : adapt to M2M
def related_template(self, obj):
return '%s'%(obj.template.name)
related_template.short_description = 'Template'


class ProjectSheetTemplateAdmin(admin.ModelAdmin):
inlines = [ProjectSheetQuestionInline]
# pass
inlines = [ProjectSheetQuestionInline]


class ProjectSheetAdmin(SimpleHistoryAdmin):
Expand Down
2 changes: 1 addition & 1 deletion projectsheet/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class Meta:
always_return_data = True

class ProjectSheetQuestionResource(ModelResource):
choices = fields.ToManyField(QuestionChoiceResource, 'choices', full=True, null=True)
choices = fields.ForeignKey(QuestionChoiceResource, 'choices', full=True, null=True)
class Meta:
queryset = ProjectSheetQuestion.objects.all()
allowed_methods = ['post', 'get']
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
# -*- 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):
# Deleting field 'ProjectSheetQuestion.template'
db.delete_column(u'projectsheet_projectsheetquestion', 'template_id')

# Adding M2M table for field template on 'ProjectSheetQuestion'
m2m_table_name = db.shorten_name(u'projectsheet_projectsheetquestion_template')
db.create_table(m2m_table_name, (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('projectsheetquestion', models.ForeignKey(orm[u'projectsheet.projectsheetquestion'], null=False)),
('projectsheettemplate', models.ForeignKey(orm[u'projectsheet.projectsheettemplate'], null=False))
))
db.create_unique(m2m_table_name, ['projectsheetquestion_id', 'projectsheettemplate_id'])


def backwards(self, orm):
# Adding field 'ProjectSheetQuestion.template'
db.add_column(u'projectsheet_projectsheetquestion', 'template',
self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='questions', to=orm['projectsheet.ProjectSheetTemplate']),
keep_default=False)

# Removing M2M table for field template on 'ProjectSheetQuestion'
db.delete_table(db.shorten_name(u'projectsheet_projectsheetquestion_template'))


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'bucket.bucket': {
'Meta': {'object_name': 'Bucket'},
'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buckets_created'", 'to': u"orm['auth.User']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
u'bucket.bucketfile': {
'Meta': {'object_name': 'BucketFile'},
'being_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'editor_of'", 'null': 'True', 'to': u"orm['auth.User']"}),
'bucket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': u"orm['bucket.Bucket']"}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255'}),
'filename': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'thumbnail_url': ('django.db.models.fields.CharField', [], {'max_length': '2048'}),
'updated_on': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'uploader_of'", 'to': u"orm['auth.User']"}),
'uploaded_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'})
},
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'projects.project': {
'Meta': {'object_name': 'Project'},
'baseline': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
'begin_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
'created_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['scout.Place']", 'null': 'True', 'blank': 'True'}),
'progress': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['projects.ProjectProgress']", 'null': 'True', 'blank': 'True'}),
'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': 'None', 'unique_with': '()'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
u'projects.projectprogress': {
'Meta': {'ordering': "['order']", 'object_name': 'ProjectProgress'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
'icon': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'progress_range': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['projects.ProjectProgressRange']"})
},
u'projects.projectprogressrange': {
'Meta': {'object_name': 'ProjectProgressRange'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': "'name'", 'unique_with': '()'})
},
u'projectsheet.historicalprojectsheet': {
'Meta': {'ordering': "(u'-history_date', u'-history_id')", 'object_name': 'HistoricalProjectSheet'},
'bucket_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'cover_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
u'history_date': ('django.db.models.fields.DateTimeField', [], {}),
u'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
u'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
u'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}),
u'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
'project_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'template_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'videos': ('jsonfield.fields.JSONField', [], {'default': 'None', 'null': 'True', 'blank': 'True'})
},
u'projectsheet.projectsheet': {
'Meta': {'object_name': 'ProjectSheet'},
'bucket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bucket.Bucket']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'cover': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'project_sheets_covered'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['bucket.BucketFile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'project': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['projects.Project']", 'unique': 'True'}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['projectsheet.ProjectSheetTemplate']"}),
'videos': ('jsonfield.fields.JSONField', [], {'default': 'None', 'null': 'True', 'blank': 'True'})
},
u'projectsheet.projectsheetquestion': {
'Meta': {'ordering': "('order',)", 'object_name': 'ProjectSheetQuestion'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'template': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'questions'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['projectsheet.ProjectSheetTemplate']"}),
'text': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
u'projectsheet.projectsheetquestionanswer': {
'Meta': {'ordering': "('question__order',)", 'object_name': 'ProjectSheetQuestionAnswer'},
'answer': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'projectsheet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_answers'", 'to': u"orm['projectsheet.ProjectSheet']"}),
'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': u"orm['projectsheet.ProjectSheetQuestion']"}),
'selected_choices_id': ('jsonfield.fields.JSONField', [], {'default': 'None', 'null': 'True', 'blank': 'True'})
},
u'projectsheet.projectsheettemplate': {
'Meta': {'object_name': 'ProjectSheetTemplate'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'shortdesc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': "'name'", 'unique_with': '()'})
},
u'projectsheet.questionchoice': {
'Meta': {'object_name': 'QuestionChoice'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': u"orm['projectsheet.ProjectSheetQuestion']"}),
'text': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'value': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
},
u'scout.place': {
'Meta': {'object_name': 'Place'},
'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'place'", 'null': 'True', 'to': u"orm['scout.PostalAddress']"}),
'geo': ('django.contrib.gis.db.models.fields.PointField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'scout.postaladdress': {
'Meta': {'object_name': 'PostalAddress'},
'address_locality': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'address_region': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
'country': ('django.db.models.fields.CharField', [], {'max_length': '2'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'post_office_box_number': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}),
'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'street_address': ('django.db.models.fields.TextField', [], {'blank': 'True'})
}
}

complete_apps = ['projectsheet']
3 changes: 2 additions & 1 deletion projectsheet/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ class ProjectSheetTemplate(models.Model):
name = models.CharField(max_length=100)
slug = AutoSlugField(unique=True, populate_from="name", always_update=True)
shortdesc = models.CharField(max_length=255, null=True, blank=True)
#questions = models.ManyToManyField("projectsheet.models.ProjectSheetQuestion", related_name='template')

def __unicode__(self):
return self.name


class ProjectSheetQuestion(models.Model):
template = models.ForeignKey(ProjectSheetTemplate, related_name='questions')
template = models.ManyToManyField(ProjectSheetTemplate, related_name='questions', null=True, blank=True)
order = models.PositiveIntegerField(default=0)
text = models.CharField(max_length=255)

Expand Down