import django
from django.dispatch import dispatcher
from django.db.models import signals
from django.utils.functional import curry
import pycon.propmgr.models as propmgr_app

data = [
 {'name': u'Authors',
  'permissions': [u'can_view_proposal_listing',
                  u'can_view_reviewers']},
 {'name': u'Submitters',
  'permissions': [u'can_view_proposal_listing',
                  u'can_view_reviewers']},
 {'name': u'Organizers',
  'permissions': [u'can_view_all_proposals',
                  u'can_view_authors',
                  u'can_view_reviewers',
                  u'can_view_proposal_stats',
                  u'can_view_proposal_listing',
                  u'can_view_all_comments',
                  u'can_view_all_reviews',
                  u'delete_attachedfile',
                  u'change_attachedfile',]},
 {'name': u'Reviewers',
  'permissions': [u'can_view_all_proposals',
                  u'can_view_authors',
                  u'can_view_proposal_stats',
                  u'can_view_proposal_listing',
                  u'can_view_all_comments',
                  u'can_view_all_reviews',
                  u'add_review',
                  ]},
 #{'name': u'TutorialReviewers',
 # 'permissions': [u'can_view_all_proposals',
 #                 u'can_view_proposal_stats',
 #                 u'can_view_proposal_listing',
 #                 u'can_view_all_comments',
 #                 u'can_view_all_reviews',
 #                 u'add_review',
                  #u'can_view_all_authors_override',
 #                 ]},

]

from django.contrib.auth.models import Permission, Group
from django.contrib.contenttypes.models import ContentType
from django.db.models import get_models
def create_group_permissions(app, created_models, verbosity, **kwdargs):
    global data
    from django.contrib.contenttypes.models import ContentType
    from django.contrib.auth.models import Permission
    from django.contrib.auth.management import create_permissions
    create_permissions(app, created_models, verbosity)

    #if not created_models or 'groups' not in kwdargs: return

    app_models = get_models(app)
    if not app_models:
        return
    ids = [ContentType.objects.get_for_model(klass).id for klass in app_models]

    #for gd in kwdargs['groups']:
    for gd in data:
        group, is_new = Group.objects.get_or_create(name=gd['name'])
        if is_new: group.save()
        permissions = Permission.objects.filter(codename__in=gd['permissions'],
                                                content_type__in=ids)
        if len(permissions) != len(gd['permissions']):
            got = set(perm.name for perm in permissions)
            expected = set(gd['permissions'])
            extra = got - expected
            missing = expected - got
            if extra: print "Extra:", extra
            if missing: print "Missing:", missing

        assert(len(permissions) == len(gd['permissions']))
        lookup = dict((perm.id, perm) for perm in permissions)
        has = set(perm['id'] for perm in group.permissions.values('id'))
        missing = [lookup[id] for id in set(lookup.keys()) - has]
        if missing:
            group.permissions.add(*missing)
            for perm in missing:
                print (u"Adding permission '" + unicode(lookup[perm. id]) +
                       u"' to group '" + group.name + "'")
            group.save()


dispatcher.connect(#curry(create_group_permissions, groups=data),
                   create_group_permissions,
                   sender=propmgr_app,
                   signal=signals.post_syncdb)
