Revision 0be81d73 snf-astakos-app/astakos/api/__init__.py

b/snf-astakos-app/astakos/api/__init__.py
77 77
        data = '%s(%s)' % (callback, data)
78 78

  
79 79
    return HttpResponse(content=data, mimetype=mimetype)
80

  
81

  
82
@api_method()
83
def get_menu(request, with_extra_links=False, with_signout=True):
84
    user = request.user
85
    index_url = reverse('index')
86

  
87
    if isinstance(user, User) and user.is_authenticated():
88
        l = []
89
        append = l.append
90
        item = MenuItem
91
        item.current_path = absolute(request, request.path)
92
        append(item(url=absolute(request, reverse('index')),
93
                    name=user.email))
94
        if with_extra_links:
95
            append(item(url=absolute(request, reverse('landing')),
96
                        name="Overview"))
97
        if with_signout:
98
            append(item(url=absolute(request, reverse('landing')),
99
                        name="Dashboard"))
100
        if with_extra_links:
101
            append(item(url=absolute(request, reverse('edit_profile')),
102
                        name="Profile"))
103

  
104
        if with_extra_links:
105
            if settings.INVITATIONS_ENABLED:
106
                append(item(url=absolute(request, reverse('invite')),
107
                            name="Invitations"))
108

  
109
            append(item(url=absolute(request, reverse('resource_usage')),
110
                        name="Usage"))
111

  
112
            if settings.PROJECTS_VISIBLE:
113
                append(item(url=absolute(request, reverse('project_list')),
114
                            name="Projects"))
115
            #append(item(
116
                #url=absolute(request, reverse('api_access')),
117
                #name="API Access"))
118

  
119
            append(item(url=absolute(request, reverse('feedback')),
120
                        name="Contact"))
121
        if with_signout:
122
            append(item(url=absolute(request, reverse('logout')),
123
                        name="Sign out"))
124
    else:
125
        l = [{'url': absolute(request, index_url),
126
              'name': _("Sign in")}]
127

  
128
    callback = request.GET.get('callback', None)
129
    data = json.dumps(tuple(l))
130
    mimetype = 'application/json'
131

  
132
    if callback:
133
        mimetype = 'application/javascript'
134
        data = '%s(%s)' % (callback, data)
135

  
136
    return HttpResponse(content=data, mimetype=mimetype)
137

  
138

  
139
class MenuItem(dict):
140
    current_path = ''
141

  
142
    def __init__(self, *args, **kwargs):
143
        super(MenuItem, self).__init__(*args, **kwargs)
144
        if kwargs.get('url') or kwargs.get('submenu'):
145
            self.__set_is_active__()
146

  
147
    def __setitem__(self, key, value):
148
        super(MenuItem, self).__setitem__(key, value)
149
        if key in ('url', 'submenu'):
150
            self.__set_is_active__()
151

  
152
    def __set_is_active__(self):
153
        if self.get('is_active'):
154
            return
155
        if self.current_path.startswith(self.get('url')):
156
            self.__setitem__('is_active', True)
157
        else:
158
            submenu = self.get('submenu', ())
159
            current = (i for i in submenu if i.get('url') == self.current_path)
160
            try:
161
                current_node = current.next()
162
                if not current_node.get('is_active'):
163
                    current_node.__setitem__('is_active', True)
164
                self.__setitem__('is_active', True)
165
            except StopIteration:
166
                return
167

  
168
    def __setattribute__(self, name, value):
169
        super(MenuItem, self).__setattribute__(name, value)
170
        if name == 'current_path':
171
            self.__set_is_active__()

Also available in: Unified diff