X-Git-Url: http://git.onelab.eu/?p=myslice.git;a=blobdiff_plain;f=portal%2Fslicerequestview.py;h=4975a92f87dbe3f182145fbfae7c9a5571b80e62;hp=f92214e32ae7094813f1e3a193bbd6d547502215;hb=0d118a5f600b06616c2841e92642a303d8785269;hpb=094cdb72aaa89588fffac49b42c1d3003152de04 diff --git a/portal/slicerequestview.py b/portal/slicerequestview.py index f92214e3..4975a92f 100644 --- a/portal/slicerequestview.py +++ b/portal/slicerequestview.py @@ -2,73 +2,109 @@ from django.template.loader import render_to_string from django.shortcuts import render from django.core.mail import send_mail +from unfold.page import Page + from manifold.core.query import Query -from manifold.manifoldapi import execute_query +from manifold.manifoldapi import execute_admin_query, execute_query from portal.models import PendingSlice from portal.actions import authority_get_pi_emails from portal.forms import SliceRequestForm from unfold.loginrequired import LoginRequiredAutoLogoutView -from myslice.viewutils import topmenu_items, the_user +from ui.topmenu import topmenu_items_live, the_user class SliceRequestView (LoginRequiredAutoLogoutView): - - def authority_hrn_initial (self, request): - authorities_query = Query.get('authority').filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']).select('name', 'authority_hrn') -# authorities_query = Query.get('authority').select('authority_hrn') - authorities = execute_query(request, authorities_query) - - authority_hrn_tuples = [ (authority['authority_hrn'], authority['name'],) for authority in authorities ] - return {'authority_hrn': authority_hrn_tuples} + def __init__ (self): + self.user_email = '' + self.errors = [] # because we inherit LoginRequiredAutoLogoutView that is implemented by redefining 'dispatch' # we cannot redefine dispatch here, or we'd lose LoginRequired and AutoLogout behaviours def post (self, request): - - # The form has been submitted - form = SliceRequestForm(request.POST, initial=self.authority_hrn_initial(request)) - - if form.is_valid(): - slice_name = form.cleaned_data['slice_name'] - authority_hrn = form.cleaned_data['authority_hrn'] - number_of_nodes = form.cleaned_data['number_of_nodes'] - type_of_nodes = form.cleaned_data['type_of_nodes'] - purpose = form.cleaned_data['purpose'] - - s = PendingSlice( - slice_name = slice_name, - authority_hrn = authority_hrn, - number_of_nodes = number_of_nodes, - type_of_nodes = type_of_nodes, - purpose = purpose - ) - s.save() + return self.get_or_post (request, 'POST') - # All validation rules pass; process data in form.cleaned_data - # slice_name, number_of_nodes, type_of_nodes, purpose - email = form.cleaned_data['email'] # email of the sender - cc_myself = form.cleaned_data['cc_myself'] + def get (self, request): + return self.get_or_post (request, 'GET') - # The recipients are the PI of the authority - recipients = authority_get_pi_emails(request,authority_hrn) - #recipients = ['yasin.upmc@gmail.com','jordan.auge@lip6.fr'] - if cc_myself: - recipients.append(email) - msg = render_to_string('slice-request-email.txt', form.cleaned_data) - send_mail("Onelab user %s requested a slice"%email , msg, email, recipients) + def get_or_post (self, request, method): + # Using cache manifold-tables to get the list of authorities faster + authorities_query = Query.get('authority').select('name', 'authority_hrn') + authorities = execute_admin_query(request, authorities_query) + if authorities is not None: + authorities = sorted(authorities) - return render(request,'slice-request-ack-view.html') # Redirect after POST - else: - return self._display (request, form) + user_query = Query().get('local:user').select('email') + user_email = execute_query(self.request, user_query) + self.user_email = user_email[0].get('email') - def get (self, request): - return self._display (request, SliceRequestForm(initial=self.authority_hrn_initial(request))) + user_query = Query().get('user').select('user_hrn').filter_by('user_hrn','==','$user_hrn') + user_hrn = execute_query(self.request, user_query) + self.user_hrn = user_hrn[0].get('user_hrn') - def _display (self, request, form): - return render(request, 'slice-request-view.html', { - 'form': form, - 'topmenu_items': topmenu_items('Request a slice', request), - 'username': the_user (request) - }) + page = Page(request) + page.add_css_files ( [ "http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] ) + if method == 'POST': + self.errors = [] + + # The form has been submitted + slice_name = request.POST.get('slice_name', '') + authority_hrn = request.POST.get('authority_hrn', '') + number_of_nodes = request.POST.get('number_of_nodes', '') + purpose = request.POST.get('purpose', '') + email = self.user_email + user_hrn = self.user_hrn + cc_myself = True + + if (authority_hrn is None or authority_hrn == ''): + self.errors.append('Please, select an authority') + # What kind of slice name is valid? + if (slice_name is None or slice_name == ''): + self.errors.append('Slice Name is mandatory') + + if (purpose is None or purpose == ''): + self.errors.append('Purpose is mandatory') + + if not self.errors: + ctx = { + 'email': email, + 'slice_name': slice_name, + 'authority_hrn': authority_hrn, + 'number_of_nodes': number_of_nodes, + 'purpose': purpose, + } + s = PendingSlice( + slice_name = slice_name, + user_hrn = user_hrn, + authority_hrn = authority_hrn, + number_of_nodes = number_of_nodes, + purpose = purpose + ) + s.save() + + # The recipients are the PI of the authority + recipients = authority_get_pi_emails(request, authority_hrn) + + if cc_myself: + recipients.append(email) + msg = render_to_string('slice-request-email.txt', ctx) + #print "email, msg, email, recipients", email , msg, email, recipients + send_mail("Onelab user %s requested a slice"%email , msg, email, recipients) + + return render(request,'slice-request-ack-view.html') # Redirect after POST + + template_env = { + 'topmenu_items': topmenu_items_live('Request a slice', page), + 'errors': self.errors, + 'slice_name': request.POST.get('slice_name', ''), + 'authority_hrn': request.POST.get('authority_hrn', ''), + 'number_of_nodes': request.POST.get('number_of_nodes', ''), + 'purpose': request.POST.get('purpose', ''), + 'email': self.user_email, + 'user_hrn': self.user_hrn, + 'cc_myself': True, + 'authorities': authorities, + } + template_env.update(page.prelude_env ()) + return render(request, 'slicerequest_view.html',template_env)