| Trees | Indices | Help |
|
|---|
|
|
1 '''
2 Created on Jun 17, 2010
3
4 @author: jnaous
5 '''
6 from django.views.generic import create_update, list_detail, simple
7 from django.core.urlresolvers import reverse, get_callable
8 from django.shortcuts import get_object_or_404
9 from django.http import Http404, HttpResponseRedirect, HttpResponseNotAllowed
10 from expedient.common.utils.views import generic_crud
11 from expedient.common.messaging.models import DatedMessage
12 from expedient.clearinghouse.project.models import Project
13 from expedient.clearinghouse.aggregate.models import Aggregate
14 from models import Slice
15 from forms import SliceCrudForm
16 from django.conf import settings
17 import logging
18 from expedient.common.permissions.shortcuts import must_have_permission
19
20 logger = logging.getLogger("SliceViews")
21
22 TEMPLATE_PATH = "expedient/clearinghouse/slice"
23
25 '''Create a slice'''
26 project = get_object_or_404(Project, id=proj_id)
27
28 must_have_permission(request.user, project, "can_create_slices")
29
30 def pre_save(instance, created):
31 instance.project = project
32 instance.owner = request.user
33 instance.reserved = False
34
35 return generic_crud(
36 request, None, Slice,
37 TEMPLATE_PATH+"/create_update.html",
38 redirect=lambda instance:reverse("slice_detail", args=[instance.id]),
39 form_class=SliceCrudForm,
40 extra_context={
41 "project": project,
42 "title": "Create slice",
43 "cancel_url": reverse("project_detail", args=[proj_id]),
44 },
45 pre_save=pre_save,
46 success_msg = lambda instance: "Successfully created slice %s." % instance.name,
47 )
48
50 '''Update a slice's information'''
51
52 project = get_object_or_404(Project, slice__pk=slice_id)
53 must_have_permission(request.user, project, "can_edit_slices")
54
55 return generic_crud(
56 request, slice_id, Slice,
57 TEMPLATE_PATH+"/create_update.html",
58 redirect=lambda instance:reverse("slice_detail", args=[instance.id]),
59 extra_context={
60 "title": "Create slice",
61 "cancel_url": reverse("slice_detail", args=[slice_id]),
62 },
63 form_class=SliceCrudForm,
64 success_msg = lambda instance: "Successfully updated slice %s." % instance.name,
65 )
66
68 '''Delete the slice'''
69 slice = get_object_or_404(Slice, id=slice_id)
70 project = slice.project
71
72 must_have_permission(request.user, project, "can_delete_slices")
73
74 if request.method == "POST":
75 stop(request, slice_id)
76 slice.delete()
77 DatedMessage.objects.post_message_to_user(
78 "Successfully deleted slice %s" % slice.name,
79 request.user, msg_type=DatedMessage.TYPE_SUCCESS)
80 return HttpResponseRedirect(
81 reverse('project_detail', args=[project.id]))
82
83 else:
84 return simple.direct_to_template(
85 request,
86 template=TEMPLATE_PATH+"/confirm_delete.html",
87 extra_context={"object": slice},
88 )
89
91 '''Show information about the slice'''
92 slice = get_object_or_404(Slice, id=slice_id)
93
94 must_have_permission(request.user, slice.project, "can_view_project")
95
96 resource_list = [rsc.as_leaf_class() for rsc in slice.resource_set.all()]
97
98 return list_detail.object_detail(
99 request,
100 Slice.objects.all(),
101 object_id=slice_id,
102 template_name=TEMPLATE_PATH+"/detail.html",
103 template_object_name="slice",
104 extra_context={
105 "breadcrumbs": (
106 ("Home", reverse("home")),
107 ("Project %s" % slice.project.name, reverse("project_detail", args=[slice.project.id])),
108 ("Slice %s" % slice.name, reverse("slice_detail", args=[slice_id])),
109 ),
110 "resource_list": resource_list,
111 }
112 )
113
115 '''Start the slice on POST'''
116 slice = get_object_or_404(Slice, id=slice_id)
117
118 must_have_permission(request.user, slice.project, "can_start_slices")
119
120 if request.method == "POST":
121 try:
122 slice.start(request.user)
123 except Exception as e:
124 import traceback
125 traceback.print_exc()
126 DatedMessage.objects.post_message_to_user(
127 "Error starting slice %s: %s" % (
128 slice.name, e),
129 user=request.user, msg_type=DatedMessage.TYPE_ERROR)
130 else:
131 DatedMessage.objects.post_message_to_user(
132 "Successfully started slice %s" % slice.name,
133 request.user, msg_type=DatedMessage.TYPE_SUCCESS)
134 return HttpResponseRedirect(reverse("slice_detail", args=[slice_id]))
135 else:
136 return HttpResponseNotAllowed(["POST"])
137
139 '''Stop the slice on POST'''
140 slice = get_object_or_404(Slice, id=slice_id)
141
142 must_have_permission(request.user, slice.project, "can_stop_slices")
143
144 if request.method == "POST":
145 try:
146 slice.stop(request.user)
147 except Exception as e:
148 import traceback
149 traceback.print_exc()
150 DatedMessage.objects.post_message_to_user(
151 "Error stopping slice %s: %s" % (
152 slice.name, e),
153 user=request.user, msg_type=DatedMessage.TYPE_ERROR)
154 else:
155 DatedMessage.objects.post_message_to_user(
156 "Successfully stopped slice %s" % slice.name,
157 request.user, msg_type=DatedMessage.TYPE_SUCCESS)
158 return HttpResponseRedirect(reverse("slice_detail", args=[slice_id]))
159 else:
160 return HttpResponseNotAllowed(["POST"])
161
163 slice = get_object_or_404(Slice, id=slice_id)
164
165 plugins_info = getattr(settings, "UI_PLUGINS", [])
166
167 logger.debug("select_ui_plugin plugins_info %s" % (plugins_info,))
168
169 # plugin functions should return (name, description, url)
170 plugins = [get_callable(plugin[0])(slice) for plugin in plugins_info]
171
172 logger.debug("select_ui_plugin plugins %s" % (plugins,) )
173
174 return simple.direct_to_template(
175 request,
176 template=TEMPLATE_PATH+"/select_ui_plugin.html",
177 extra_context={
178 "plugins": plugins, "slice": slice,
179 "breadcrumbs": (
180 ("Home", reverse("home")),
181 ("Project %s" % slice.project.name, reverse("project_detail", args=[slice.project.id])),
182 ("Slice %s" % slice.name, reverse("slice_detail", args=[slice_id])),
183 ("Select UI", request.path),
184 ),
185 },
186 )
187
189 '''Add aggregate to slice'''
190
191 slice = get_object_or_404(Slice, id=slice_id)
192
193 must_have_permission(request.user, slice.project, "can_edit_slices")
194
195 aggregate_list = slice.project.aggregates.exclude(
196 id__in=slice.aggregates.values_list("id", flat=True))
197
198 if request.method == "GET":
199 return simple.direct_to_template(
200 request, template=TEMPLATE_PATH+"/add_aggregates.html",
201 extra_context={
202 "aggregate_list": aggregate_list,
203 "slice": slice,
204 "breadcrumbs": (
205 ("Home", reverse("home")),
206 ("Project %s" % slice.project.name, reverse("project_detail", args=[slice.project.id])),
207 ("Slice %s" % slice.name, reverse("slice_detail", args=[slice_id])),
208 ("Add Slice Aggregates", request.path),
209 ),
210 }
211 )
212
213 elif request.method == "POST":
214 # check which submit button was pressed
215 try:
216 agg_id = int(request.POST.get("id", 0))
217 except ValueError:
218 raise Http404
219
220 if agg_id not in aggregate_list.values_list("id", flat=True):
221 raise Http404
222
223 aggregate = get_object_or_404(Aggregate, id=agg_id).as_leaf_class()
224 return HttpResponseRedirect(aggregate.add_to_slice(
225 slice, reverse("slice_add_agg", args=[slice_id])))
226 else:
227 return HttpResponseNotAllowed("GET", "POST")
228
230 '''Update any info stored at the aggregate'''
231
232 slice = get_object_or_404(Slice, id=slice_id)
233
234 must_have_permission(request.user, slice.project, "can_edit_slices")
235
236 aggregate = get_object_or_404(
237 Aggregate, id=agg_id, id__in=slice.aggregates.values_list(
238 "id", flat=True)).as_leaf_class()
239
240 if request.method == "POST":
241 return HttpResponseRedirect(aggregate.add_to_slice(
242 slice, reverse("slice_detail", args=[slice_id])))
243 else:
244 return HttpResponseNotAllowed(["POST"])
245
247
248 slice = get_object_or_404(Slice, id=slice_id)
249
250 must_have_permission(request.user, slice.project, "can_edit_slices")
251
252 aggregate = get_object_or_404(
253 Aggregate, id=agg_id, id__in=slice.aggregates.values_list(
254 "id", flat=True)).as_leaf_class()
255
256 if request.method == "POST":
257 return HttpResponseRedirect(aggregate.remove_from_slice(
258 slice, reverse("slice_detail", args=[slice_id])))
259 else:
260 return HttpResponseNotAllowed(["POST"])
261
| Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Fri Feb 18 13:10:10 2011 | http://epydoc.sourceforge.net |