3 # Copyright 2008 the Melange authors.
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 """Views for Site Settings.
21 '"Sverre Rabbelier" <sverre@rabbelier.nl>',
25 from django
import forms
26 from django
.utils
.translation
import ugettext
28 from soc
.logic
import cleaning
29 from soc
.logic
import dicts
30 from soc
.views
import out_of_band
31 from soc
.views
.helper
import access
32 from soc
.views
.helper
import decorators
33 from soc
.views
.helper
import redirects
34 from soc
.views
.helper
import responses
35 from soc
.views
.helper
import widgets
36 from soc
.views
.models
import document
as document_view
37 from soc
.views
.models
import presence_with_tos
39 import soc
.models
.site
40 import soc
.logic
.models
.site
41 import soc
.logic
.dicts
44 class View(presence_with_tos
.View
):
45 """View methods for the Document model.
48 DEF_DOWN_FOR_MAINTENANCE_MSG
= ugettext("Down for maintenance")
49 DEF_NOT_IN_MAINTENANCE_MSG
= ugettext(
50 "The site is currently not in maintenance mode.")
52 def __init__(self
, params
=None):
53 """Defines the fields and methods required for the base View class
54 to provide the user with list, public, create, edit and delete views.
57 params: a dict with params for this View
60 rights
= access
.Checker(params
)
61 rights
['unspecified'] = ['checkIsDeveloper']
62 rights
['any_access'] = ['allow']
63 rights
['show'] = ['checkIsDeveloper']
66 new_params
['logic'] = soc
.logic
.models
.site
.logic
67 new_params
['rights'] = rights
69 new_params
['name'] = "Site Settings"
70 new_params
['name_plural'] = new_params
['name']
71 new_params
['document_prefix'] = 'site'
72 new_params
['name_short'] = "Site"
74 new_params
['sidebar_defaults'] = [('/%s/edit', 'Edit %(name)s', 'edit')]
75 new_params
['sidebar_heading'] = new_params
['name_short']
77 new_params
['edit_template'] = 'soc/site/edit.html'
78 new_params
['home_template'] = 'soc/site/home.html'
80 new_params
['create_extra_dynaproperties'] = {
81 'link_id': forms
.CharField(widget
=forms
.HiddenInput
, required
=True),
82 'clean_noreply_email': cleaning
.clean_empty_field('noreply_email'),
84 new_params
['edit_extra_dynaproperties'] = {
85 'link_id': forms
.CharField(widget
=forms
.HiddenInput
, required
=True),
86 'home_link_id': widgets
.ReferenceField(
87 reference_url
='document', required
=False,
88 filter_fields
={'prefix': new_params
['document_prefix']},
89 label
=ugettext('Home page Document link ID'),
90 help_text
=soc
.models
.work
.Work
.link_id
.help_text
),
91 'tos_link_id': widgets
.ReferenceField(
92 reference_url
='document', required
=False,
93 filter_fields
={'prefix': new_params
['document_prefix']},
94 label
=ugettext('Terms of Service Document link ID'),
95 help_text
=soc
.models
.work
.Work
.link_id
.help_text
),
100 page_name
= "Home Page"
101 patterns
+= [(r
'^$', 'soc.views.models.%(module_name)s.main_public',
104 page_name
= "Maintenance"
105 patterns
+= [(r
'^maintenance$',
106 'soc.views.models.%(module_name)s.maintenance', page_name
)]
108 page_name
= "Edit Site"
109 patterns
+= [(r
'^%(url_name)s/(?P<access_type>edit)$',
110 'soc.views.models.%(module_name)s.main_edit',
113 new_params
['extra_django_patterns'] = patterns
115 params
= dicts
.merge(params
, new_params
)
117 super(View
, self
).__init
__(params
=params
)
119 def getSidebarMenus(self
, id, user
, params
=None):
120 """See base.View.getSidebarMenus.
122 Returns a custom sidebar entry for the 'site' singleton.
125 entity
= self
._logic
.getSingleton()
130 submenus
+= document_view
.view
.getMenusForScope(entity
, self
._params
)
133 rights
= self
._params
['rights']
134 rights
.setCurrentUser(id, user
)
137 except out_of_band
.Error
:
141 submenus
+= [(redirects
.getCreateDocumentRedirect(entity
, 'site'),
142 "Create a New Document", 'any_access')]
144 submenus
+= [(redirects
.getListDocumentsRedirect(entity
, 'site'),
145 "List Documents", 'any_access')]
148 new_params
['sidebar_additional'] = submenus
150 params
= dicts
.merge(params
, new_params
)
151 return super(View
, self
).getSidebarMenus(id, user
, params
=params
)
153 def maintenance(self
, request
, page_name
):
154 """Returns a 'down for maintenance' view.
157 context
= responses
.getUniversalContext(request
)
158 context
['page_name'] = page_name
160 notice
= context
.pop('site_notice')
163 context
['body_content'] = self
.DEF_NOT_IN_MAINTENANCE_MSG
165 context
['body_content'] = notice
166 context
['header_title'] = self
.DEF_DOWN_FOR_MAINTENANCE_MSG
167 context
['sidebar_menu_items'] = [
168 {'heading': self
.DEF_DOWN_FOR_MAINTENANCE_MSG
,
172 template
= 'soc/base.html'
174 return responses
.respond(request
, template
, context
=context
)
176 def mainPublic(self
, request
, page_name
=None, **kwargs
):
177 """Displays the main site settings page.
180 request: the standard Django HTTP request object
181 page_name: the page name displayed in templates as page and header title
185 keys
= self
._logic
.getKeyFieldNames()
187 # No entity in this case, since Site key values are hard-coded for the
188 # Site singleton, so pass in None to match parent method footprint.
189 values
= self
._logic
.getKeyValuesFromEntity(None)
190 key_values
= dicts
.zip(keys
, values
)
192 return self
.home(request
, "home", page_name
=page_name
, **key_values
)
194 def mainEdit(self
, request
, page_name
=None, **kwargs
):
195 """Displays the edit page for the main site settings page.
198 request: the standard Django HTTP request object
199 page_name: the page name displayed in templates as page and header title
203 keys
= self
._logic
.getKeyFieldNames()
205 # No entity in this case, since Site key values are hard-coded for the
206 # Site singleton, so pass in None to match parent method footprint.
207 values
= self
._logic
.getKeyValuesFromEntity(None)
208 key_values
= dicts
.zip(keys
, values
)
210 return self
.edit(request
, "edit", page_name
, seed
=key_values
, **key_values
)
215 admin
= decorators
.view(view
.admin
)
216 create
= decorators
.view(view
.create
)
217 edit
= decorators
.view(view
.edit
)
218 delete
= decorators
.view(view
.delete
)
219 list = decorators
.view(view
.list)
220 public
= decorators
.view(view
.public
)
221 export
= decorators
.view(view
.export
)
222 main_public
= decorators
.view(view
.mainPublic
)
223 main_edit
= decorators
.view(view
.mainEdit
)
224 maintenance
= decorators
.view(view
.maintenance
)
225 home
= decorators
.view(view
.home
)