~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/webapp/groups/__init__.py

Moved groups over to the new class-based xhtml templating way of being
displayed

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
from ivle.database import Subject
30
30
from ivle import util
31
31
 
32
 
import genshi
33
 
import genshi.core
34
 
import genshi.template
35
 
 
36
 
def handle(req):
37
 
    # Set request attributes
38
 
    req.content_type = "text/html"
39
 
    req.styles = ["media/groups/groups.css"]
40
 
    req.scripts = [
41
 
        "media/groups/groups.js",
42
 
        "media/common/util.js",
43
 
        "media/common/json2.js",
 
32
from ivle.webapp.base.plugins import BasePlugin
 
33
from ivle.webapp.base.views import XHTMLView
 
34
 
 
35
class GroupsView(XHTMLView):
 
36
    """
 
37
    The groups view
 
38
    """
 
39
    def __init__(self, req, **kwargs):
 
40
        super(GroupsView, self).__init__(req, **kwargs)
 
41
        self.app_template = 'template.html'
 
42
        #XXX: Will hates me for this.
 
43
        self.appname = "groups"
 
44
    
 
45
    def populate(self, req, ctx):
 
46
        # Set request attributes
 
47
        req.content_type = "text/html"
 
48
        req.styles = ["media/groups/groups.css"]
 
49
        req.scripts = [
 
50
            "media/groups/groups.js",
 
51
            "media/common/util.js",
 
52
            "media/common/json2.js",
 
53
        ]
 
54
        req.write_html_head_foot = True     # Have dispatch print head and foot
 
55
        
 
56
        ctx['enrolments'] = []
 
57
        # Show a group panel per enrolment
 
58
        enrolments = req.user.active_enrolments
 
59
        if enrolments.count() == 0:
 
60
            ctx['no_enrolments'] = True
 
61
        else:
 
62
            ctx['no_enrolments'] = False
 
63
        
 
64
        for enrolment in enrolments:
 
65
            self.add_subject_panel(req, enrolment.offering, ctx)
 
66
            
 
67
        if req.user.hasCap(caps.CAP_MANAGEGROUPS):
 
68
            ctx['manage_groups'] = True
 
69
            ctx['manage_subjects'] = []
 
70
            subjects = req.store.find(Subject)
 
71
            for s in subjects:
 
72
                new_s = {}
 
73
                new_s['id'] = s.id
 
74
                new_s['name'] = s.name
 
75
                new_s['code'] = s.code
 
76
                ctx['manage_subjects'].append(new_s)
 
77
        else:
 
78
            ctx['manage_groups'] = False
 
79
      
 
80
 
 
81
    def add_subject_panel(self, req, offering, ctx):
 
82
        """
 
83
        Show the group management panel for a particular subject.
 
84
        Prints to req.
 
85
        """
 
86
        # Get the groups this user is in, for this offering
 
87
        groups = req.user.get_groups(offering)
 
88
        if groups.count() == 0:
 
89
            return
 
90
        
 
91
        offering_groups = {}
 
92
        
 
93
        offering_groups['offering_id'] = offering.id
 
94
        offering_groups['offering_name'] = offering.subject.name
 
95
        offering_groups['groups'] = []
 
96
        
 
97
        #TODO: Use a better way to manage group membership and invitations
 
98
        for group in groups:
 
99
            new_group = {}
 
100
            new_group['nick'] = cgi.escape(group.nick if group.nick else '')
 
101
            new_group['name'] = cgi.escape(group.name)
 
102
            
 
103
            # XXX - This should be set to reflect whether or not a user is invited
 
104
            #     - or if they have accepted the offer
 
105
            new_group['is_member'] = True
 
106
            new_group['members'] = []
 
107
            
 
108
            for user in group.members:
 
109
                member = {}
 
110
                member['fullname'] = cgi.escape(user.fullname)
 
111
                member['login'] = cgi.escape(user.login)
 
112
                new_group['members'].append(member)
 
113
            offering_groups['groups'].append(new_group)
 
114
 
 
115
        ctx['enrolments'].append(offering_groups)
 
116
    
 
117
class Plugin(BasePlugin):
 
118
    """
 
119
    The Plugin class for the user plugin.
 
120
    """
 
121
    # Magic attribute: urls
 
122
    # Sequence of pairs/triples of
 
123
    # (regex str, handler class, kwargs dict)
 
124
    # The kwargs dict is passed to the __init__ of the view object
 
125
    urls = [
 
126
        ('groups/*(path)', GroupsView),
 
127
        ('groups/', GroupsView),
44
128
    ]
45
 
    req.write_html_head_foot = True     # Have dispatch print head and foot
46
 
 
47
 
    ctx = genshi.template.Context()
48
 
    
49
 
    ctx['enrolments'] = []
50
 
    # Show a group panel per enrolment
51
 
    enrolments = req.user.active_enrolments
52
 
    if enrolments.count() == 0:
53
 
        ctx['no_enrolments'] = True
54
 
    else:
55
 
        ctx['no_enrolments'] = False
56
 
    
57
 
    for enrolment in enrolments:
58
 
        add_subject_panel(req, enrolment.offering, ctx)
59
 
        
60
 
    if req.user.hasCap(caps.CAP_MANAGEGROUPS):
61
 
        ctx['manage_groups'] = True
62
 
        ctx['manage_subjects'] = []
63
 
        subjects = req.store.find(Subject)
64
 
        for s in subjects:
65
 
            new_s = {}
66
 
            new_s['id'] = s.id
67
 
            new_s['name'] = s.name
68
 
            new_s['code'] = s.code
69
 
            ctx['manage_subjects'].append(new_s)
70
 
    else:
71
 
        ctx['manage_groups'] = False
72
 
  
73
 
    loader = genshi.template.TemplateLoader(".", auto_reload=True)
74
 
    tmpl = loader.load(util.make_local_path("apps/groups/template.html"))
75
 
    
76
 
    req.write(tmpl.generate(ctx).render('html'))
77
 
 
78
 
def add_subject_panel(req, offering, ctx):
79
 
    """
80
 
    Show the group management panel for a particular subject.
81
 
    Prints to req.
82
 
    """
83
 
    # Get the groups this user is in, for this offering
84
 
    groups = req.user.get_groups(offering)
85
 
    if groups.count() == 0:
86
 
        return
87
 
    
88
 
    offering_groups = {}
89
 
    
90
 
    offering_groups['offering_id'] = offering.id
91
 
    offering_groups['offering_name'] = offering.subject.name
92
 
    offering_groups['groups'] = []
93
 
    
94
 
    #TODO: Use a better way to manage group membership and invitations
95
 
    for group in groups:
96
 
        new_group = {}
97
 
        new_group['nick'] = cgi.escape(group.nick if group.nick else '')
98
 
        new_group['name'] = cgi.escape(group.name)
99
 
        
100
 
        # XXX - This should be set to reflect whether or not a user is invited
101
 
        #     - or if they have accepted the offer
102
 
        new_group['is_member'] = True
103
 
        new_group['members'] = []
104
 
        
105
 
        for user in group.members:
106
 
            member = {}
107
 
            member['fullname'] = cgi.escape(user.fullname)
108
 
            member['login'] = cgi.escape(user.login)
109
 
            new_group['members'].append(member)
110
 
        offering_groups['groups'].append(new_group)
111
 
 
112
 
    ctx['enrolments'].append(offering_groups)