Package expedient :: Package clearinghouse :: Package slice :: Module views
[hide private]
[frames] | no frames]

Source Code for Module expedient.clearinghouse.slice.views

  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   
24 -def create(request, proj_id):
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
49 -def update(request, slice_id):
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
67 -def delete(request, slice_id):
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
90 -def detail(request, slice_id):
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
114 -def start(request, slice_id):
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
138 -def stop(request, slice_id):
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
162 -def select_ui_plugin(request, slice_id):
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
188 -def add_aggregate(request, slice_id):
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
229 -def update_aggregate(request, slice_id, agg_id):
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
246 -def remove_aggregate(request, slice_id, agg_id):
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