From 2970f242456a39b90b4d8616fc68af2f3bb1ca97 Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 3 Jul 2013 09:24:02 -0400 Subject: [PATCH] Initial admin table view. --- cms/djangoapps/auth/authz.py | 4 +++ cms/djangoapps/course_creators/admin.py | 22 ++++++++++++++ .../migrations/0001_initial.py | 14 ++++----- cms/djangoapps/course_creators/models.py | 30 ++++++++++++++++++- cms/djangoapps/course_creators/views.py | 20 +++++++++++++ cms/envs/common.py | 3 ++ cms/urls.py | 8 +++-- 7 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 cms/djangoapps/course_creators/admin.py create mode 100644 cms/djangoapps/course_creators/views.py diff --git a/cms/djangoapps/auth/authz.py b/cms/djangoapps/auth/authz.py index 23dde88e94..77e4d5037d 100644 --- a/cms/djangoapps/auth/authz.py +++ b/cms/djangoapps/auth/authz.py @@ -3,6 +3,7 @@ from django.core.exceptions import PermissionDenied from django.conf import settings from xmodule.modulestore import Location +from course_creators import views ''' This code is somewhat duplicative of access.py in the LMS. We will unify the code as a separate story @@ -221,3 +222,6 @@ def _grant_instructors_creator_access(caller): if group.name.startswith(INSTRUCTOR_ROLE_NAME + "_"): for user in group.user_set.all(): add_user_to_creator_group(caller, user) + views.add_user_with_status_granted(user) + elif group.name.startswith(STAFF_ROLE_NAME + "_"): + views.add_user_with_status_unrequested(user) diff --git a/cms/djangoapps/course_creators/admin.py b/cms/djangoapps/course_creators/admin.py new file mode 100644 index 0000000000..6cea8c6235 --- /dev/null +++ b/cms/djangoapps/course_creators/admin.py @@ -0,0 +1,22 @@ +""" +django admin page for the course creators table +""" + +from course_creators.models import CourseCreator +from django.contrib import admin + + +class CourseCreatorAdmin(admin.ModelAdmin): + list_display = ('username', 'state', 'state_changed', 'note') + + def has_add_permission(self, request): + return False + + def has_delete_permission(self, request, obj=None): + return False + + def has_change_permission(self, request, obj=None): + return request.user.is_staff + + +admin.site.register(CourseCreator, CourseCreatorAdmin) diff --git a/cms/djangoapps/course_creators/migrations/0001_initial.py b/cms/djangoapps/course_creators/migrations/0001_initial.py index a5668bbe3c..7e91e08261 100644 --- a/cms/djangoapps/course_creators/migrations/0001_initial.py +++ b/cms/djangoapps/course_creators/migrations/0001_initial.py @@ -8,24 +8,24 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding model 'CourseCreators' - db.create_table('course_creators_coursecreators', ( + # Adding model 'CourseCreator' + db.create_table('course_creators_coursecreator', ( ('username', self.gf('django.db.models.fields.CharField')(unique=True, max_length=64, primary_key=True)), ('state_changed', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), ('state', self.gf('django.db.models.fields.CharField')(default='u', max_length=1)), ('note', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), )) - db.send_create_signal('course_creators', ['CourseCreators']) + db.send_create_signal('course_creators', ['CourseCreator']) def backwards(self, orm): - # Deleting model 'CourseCreators' - db.delete_table('course_creators_coursecreators') + # Deleting model 'CourseCreator' + db.delete_table('course_creators_coursecreator') models = { - 'course_creators.coursecreators': { - 'Meta': {'object_name': 'CourseCreators'}, + 'course_creators.coursecreator': { + 'Meta': {'object_name': 'CourseCreator'}, 'note': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), 'state': ('django.db.models.fields.CharField', [], {'default': "'u'", 'max_length': '1'}), 'state_changed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), diff --git a/cms/djangoapps/course_creators/models.py b/cms/djangoapps/course_creators/models.py index b9814a6033..c8159b66b1 100644 --- a/cms/djangoapps/course_creators/models.py +++ b/cms/djangoapps/course_creators/models.py @@ -2,9 +2,14 @@ Table for storing information about whether or not Studio users have course creation privileges. """ from django.db import models +from django.db.models.signals import post_init, post_save +from django.dispatch import receiver +from auth.authz import add_user_to_creator_group, remove_user_from_creator_group + +import datetime -class CourseCreators(models.Model): +class CourseCreator(models.Model): """ Creates the database table model. """ @@ -23,7 +28,30 @@ class CourseCreators(models.Model): note = models.CharField(max_length=512, blank=True, help_text='Optional notes about this user (for example, ' 'why course creation access was denied)') + def __unicode__(self): s = "%s | %s [%s] | %s" % (self.username, self.state, self.state_changed, self.note) return s + +@receiver(post_init, sender=CourseCreator) +def post_init_callback(sender, **kwargs): + instance = kwargs['instance'] + instance.orig_state = instance.state + +@receiver(post_save, sender=CourseCreator) +def post_save_callback(sender, **kwargs): + instance = kwargs['instance'] + # We only wish to modify the state_changed time if the state has been modified. We don't wish to + # modify it for changes to the notes field. + if instance.state != instance.orig_state: + instance.state_changed = datetime.datetime.now() + if instance.state == 'g': + # add to course group + instance.state = 'g' + else: + # remove from course group + instance.state = instance.state + + instance.orig_state = instance.state + instance.save() diff --git a/cms/djangoapps/course_creators/views.py b/cms/djangoapps/course_creators/views.py new file mode 100644 index 0000000000..acdd50a0ca --- /dev/null +++ b/cms/djangoapps/course_creators/views.py @@ -0,0 +1,20 @@ +from course_creators.models import CourseCreator + + +def add_user_with_status_unrequested(user): + """ + Adds a user to the course creator table with status 'unrequested'. + """ + _add_user(user, 'u') + + +def add_user_with_status_granted(user): + """ + Adds a user to the course creator table with status 'granted'. + """ + _add_user(user, 'g') + +def _add_user(user, state): + if CourseCreator.objects.filter(username=user.username).count() == 0: + entry = CourseCreator(username=user.username, state=state) + entry.save() \ No newline at end of file diff --git a/cms/envs/common.py b/cms/envs/common.py index 73d19f5674..c8840e9634 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -346,6 +346,9 @@ INSTALLED_APPS = ( # comment common 'django_comment_common', + + # for course creator table + 'django.contrib.admin' ) ################# EDX MARKETING SITE ################################## diff --git a/cms/urls.py b/cms/urls.py index d04c311161..6a061c3a03 100644 --- a/cms/urls.py +++ b/cms/urls.py @@ -6,8 +6,8 @@ from django.conf.urls import patterns, include, url from . import one_time_startup # Uncomment the next two lines to enable the admin: -# from django.contrib import admin -# admin.autodiscover() +from django.contrib import admin +admin.autodiscover() urlpatterns = ('', # nopep8 url(r'^$', 'contentstore.views.howitworks', name='homepage'), @@ -146,6 +146,10 @@ if settings.MITX_FEATURES.get('ENABLE_SERVICE_STATUS'): url(r'^status/', include('service_status.urls')), ) +urlpatterns += ( + url(r'^admin/', include(admin.site.urls)), + ) + urlpatterns = patterns(*urlpatterns) # Custom error pages