updated portal application
authorJordan Augé <jordan.auge@lip6.fr>
Tue, 2 Jul 2013 15:24:21 +0000 (17:24 +0200)
committerJordan Augé <jordan.auge@lip6.fr>
Tue, 2 Jul 2013 15:24:21 +0000 (17:24 +0200)
myslice/settings.py
portal/forms.py [new file with mode: 0644]
portal/models.py
portal/templates/register_user.html [new file with mode: 0644]
portal/templates/register_user_wizard.html [new file with mode: 0644]
portal/urls.py
portal/views.py
views/templates/layout-unfold1.html

index e7d1bb2..59276f5 100644 (file)
@@ -154,6 +154,8 @@ INSTALLED_APPS = (
     # Uncomment the next line to enable admin documentation:
     # 'django.contrib.admindocs',
     'portal',
+    'django.contrib.formtools',
+    'crispy_forms',
 )
 
 # A sample logging configuration. The only tangible logging
diff --git a/portal/forms.py b/portal/forms.py
new file mode 100644 (file)
index 0000000..2b304cc
--- /dev/null
@@ -0,0 +1,31 @@
+#-*- coding: utf-8 -*-
+
+from django import forms
+from portal.models import PendingUser
+from crispy_forms.helper import FormHelper
+from crispy_forms.layout import Submit
+
+class RegisterUserForm(forms.ModelForm):
+    def __init__(self, *args, **kwargs):
+        self.helper = FormHelper()
+        self.helper.form_tag = False
+        #self.helper.form_id = 'id-exampleForm'
+        self.helper.form_class = 'blueForms'
+        self.helper.form_method = 'post'
+        #self.helper.form_action = 'submit_survey'
+        self.helper.add_input(Submit('submit', 'Submit'))
+        super(RegisterUserForm, self).__init__(*args, **kwargs)
+
+    first_name = forms.CharField( widget=forms.TextInput )
+    last_name  = forms.CharField( widget=forms.TextInput )
+    email      = forms.CharField( widget=forms.TextInput )
+    password   = forms.CharField( widget=forms.PasswordInput )
+    password2  = forms.CharField( widget=forms.PasswordInput )
+    keypair    = forms.CharField( widget=forms.PasswordInput )
+    #keypair    = forms.CharField( widget=forms.FileInput )
+    class Meta:
+        model = PendingUser
+
+class RegisterUserStep2Form(forms.ModelForm):
+    class Meta:
+        model = PendingUser
index 71a8362..316ed54 100644 (file)
@@ -1,3 +1,18 @@
 from django.db import models
 
 # Create your models here.
+
+class Institution(models.Model):
+    name = models.TextField()
+    # list of associated email domains 
+
+class PendingUser(models.Model):
+    first_name  = models.TextField()
+    last_name   = models.TextField()
+    email       = models.TextField()
+    password    = models.TextField()
+    keypair     = models.TextField()
+    # institution
+
+class PendingSlice(models.Model):
+    slice_name  = models.TextField()
diff --git a/portal/templates/register_user.html b/portal/templates/register_user.html
new file mode 100644 (file)
index 0000000..8d1d528
--- /dev/null
@@ -0,0 +1,68 @@
+{% extends "layout-unfold1.html" %}
+{% load i18n %}
+{% load crispy_forms_tags %}
+
+
+{% block head %}
+{{ wizard.form.media }}
+<link rel="stylesheet" type="text/css" href="{{STATIC_URL}}css/smart_wizard.css" />
+{% endblock %}
+
+{% block unfold1_main %}
+
+  <h1>User registration</h1>
+
+  <div class='swMain'>
+
+    <ul class='anchor'>
+      {% for step in wizard.steps.all %}
+        <li>
+          <a href="#step-1" class="selected" isdone="0" rel="1">
+            <label class="stepNumber">{{forloop.counter}}</label>
+            <span class="stepDesc">Step {{forloop.counter}}<br><small>NAME OF THE STEP HERE</small></span>
+          </a>
+        </li>
+      {% endfor %}
+    </ul>
+    <div style='clear: both;'/>
+    
+        <form action="" method="post">{% csrf_token %}
+          <table>
+            {% if wizard.form.forms %}
+                {{ wizard.management_form }}
+                {% for form in wizard.form.forms %}
+                    {% crispy form form.helper %}
+                {% endfor %}
+            {% else %}
+                {{ wizard.management_form }}
+                {% crispy wizard.form %}
+            {% endif %}
+          </table>
+
+    {% if wizard.steps.prev %}
+      <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
+      <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
+    {% endif %}
+
+    <div class='actionBar'>
+      <input class='buttonNext' type="submit" value="{% trans "submit" %}"/>
+
+      <div class="contrdol-group">
+        <div class="contrdols">
+          {% if wizard.steps.prev %}
+            <button class="buttonPrevious" name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">prev step</button>
+          {% endif %}
+          <input class="buttonNext" type="submit" value="next step"/>
+        </div>
+      </div>
+    </div>
+        </form>
+
+    <div class="progress progress-info progress-striped" style="clear: both;">
+        <div class="bar" style="width:{% widthratio wizard.steps.step1 wizard.steps.count 100%}%">
+          Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}
+        </div>
+    </div>
+  </div><!-- swMain -->
+
+{% endblock %}
diff --git a/portal/templates/register_user_wizard.html b/portal/templates/register_user_wizard.html
new file mode 100644 (file)
index 0000000..8d1d528
--- /dev/null
@@ -0,0 +1,68 @@
+{% extends "layout-unfold1.html" %}
+{% load i18n %}
+{% load crispy_forms_tags %}
+
+
+{% block head %}
+{{ wizard.form.media }}
+<link rel="stylesheet" type="text/css" href="{{STATIC_URL}}css/smart_wizard.css" />
+{% endblock %}
+
+{% block unfold1_main %}
+
+  <h1>User registration</h1>
+
+  <div class='swMain'>
+
+    <ul class='anchor'>
+      {% for step in wizard.steps.all %}
+        <li>
+          <a href="#step-1" class="selected" isdone="0" rel="1">
+            <label class="stepNumber">{{forloop.counter}}</label>
+            <span class="stepDesc">Step {{forloop.counter}}<br><small>NAME OF THE STEP HERE</small></span>
+          </a>
+        </li>
+      {% endfor %}
+    </ul>
+    <div style='clear: both;'/>
+    
+        <form action="" method="post">{% csrf_token %}
+          <table>
+            {% if wizard.form.forms %}
+                {{ wizard.management_form }}
+                {% for form in wizard.form.forms %}
+                    {% crispy form form.helper %}
+                {% endfor %}
+            {% else %}
+                {{ wizard.management_form }}
+                {% crispy wizard.form %}
+            {% endif %}
+          </table>
+
+    {% if wizard.steps.prev %}
+      <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
+      <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
+    {% endif %}
+
+    <div class='actionBar'>
+      <input class='buttonNext' type="submit" value="{% trans "submit" %}"/>
+
+      <div class="contrdol-group">
+        <div class="contrdols">
+          {% if wizard.steps.prev %}
+            <button class="buttonPrevious" name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">prev step</button>
+          {% endif %}
+          <input class="buttonNext" type="submit" value="next step"/>
+        </div>
+      </div>
+    </div>
+        </form>
+
+    <div class="progress progress-info progress-striped" style="clear: both;">
+        <div class="bar" style="width:{% widthratio wizard.steps.step1 wizard.steps.count 100%}%">
+          Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}
+        </div>
+    </div>
+  </div><!-- swMain -->
+
+{% endblock %}
index fcd4007..3be6caf 100644 (file)
@@ -1,7 +1,22 @@
 from django.conf.urls import patterns, url
 
+#from django.forms.formsets import formset_factory
+from portal.forms import RegisterUserForm, RegisterUserStep2Form
+from portal.views import RegisterUserWizardView
 from portal import views
 
+named_register_forms = (
+    ("step1", RegisterUserForm),
+    ("step2", RegisterUserStep2Form)
+)
+
+register_wizard = RegisterUserWizardView.as_view(named_register_forms,
+    url_name="register_wizard_step")
+
 urlpatterns = patterns('',
-    url(r'^$', views.index, name='index')
+    url(r'^$', views.index, name='index'),
+    url(r'^register/?$', views.register_user, name='register'),
+    url(r"^registerwizard/(?P<step>[-\w]+)/$", register_wizard,
+        name="register_wizard_step"),
+    url(r"^registerwizard/$", register_wizard, name="register_wizard")
 )
index 869bd2d..cf2af53 100644 (file)
@@ -1,3 +1,5 @@
+#-*- coding: utf-8 -*-
+
 from portal.portalpage  import PortalPage
 from plugins.wizard     import Wizard
 from plugins.form       import CreateForm
@@ -7,6 +9,89 @@ from myslice.viewutils  import the_user
 
 from django.template.loader import render_to_string
 from django.template import RequestContext
+from django.views import generic
+from django.shortcuts import render
+
+from portal.forms  import RegisterUserForm
+
+from django.contrib.formtools.wizard.views import NamedUrlSessionWizardView
+#from django.core.files.storage import FileSystemStorage
+from django.core.files.storage import default_storage
+
+#class MerlinWizard(NamedUrlSessionWizardView):
+#
+#    ...
+#    ...
+#
+#    @classonlymethod
+#    def as_view(cls, *args, **kwargs):
+#        kwargs.update({
+#            'form_list': [
+#                NameForm,
+#                QuestForm,
+#                ColorForm,
+#            ],
+#            'url_name': 'merlin_wizard'
+#        })
+#        return super(MerlinWizard, cls).as_view(*args, **kwargs)
+
+class RegisterUserWizardView(NamedUrlSessionWizardView):
+#class RegisterUserWizardView(LoginRequiredMixin, NamedUrlSessionWizardView):
+    # Notice that I specify a file storage instance. If you don't specify this,
+    # and you need to support FileField or ImageField in your forms, you'll get
+    # errors from Django. This is something else I think could be handled by
+    # the views better. Seems to me that it should just use whatever the
+    # default/specified storage is for the rest of your project/application.
+    file_storage = default_storage # FileSystemStorage()
+    template_name = "register_user_wizard.html"
+
+    def done(self, form_list, **kwargs):
+        step1_form = form_list[0]
+        step2_form = form_list[1]
+
+        productext = self.create_product(product_form)
+        shippings = self.create_shippings(productext, shipping_forms)
+        images = self.create_images(productext, image_forms)
+
+        if all([productext, shippings, images]):
+            del self.request.session["wizard_product_wizard_view"]
+
+            messages.success(self.request,
+                _("Your product has been created."))
+            return HttpResponseRedirect(self.get_success_url(productext))
+
+        messages.error(self.request, _("Something went wrong creating your "
+            "product. Please try again or contact support."))
+        return HttpResponseRedirect(reverse("register_wizard"))
+
+    #def get_form_kwargs(self, step):
+    #    if step == "product":
+    #        return {"user": self.request.user}
+    #    return {}
+
+# The portal should hook the slice and user creation pages
+
+def register_user(request):
+    
+    if request.method == 'POST':
+        form = RegisterUserForm(request.POST) # Nous reprenons les données
+        if form.is_valid():
+            first_name = form.cleaned_data['first_name']
+            last_name  = form.cleaned_data['last_name']
+            email      = form.cleaned_data['email']
+            password   = form.cleaned_data['password']
+            password2  = form.cleaned_data['password2']
+            keypair    = form.cleaned_data['keypair']
+            ## Ici nous pouvons traiter les données du formulaire
+            #sujet = form.cleaned_data['sujet']
+            #message = form.cleaned_data['message']
+            #envoyeur = form.cleaned_data['envoyeur']
+            #renvoi = form.cleaned_data['renvoi']
+            ## Nous pourrions ici envoyer l'e-mail grâce aux données que nous venons de récupérer
+            #envoi = True
+    else:
+        form = RegisterUserForm()
+    return render(request, 'register_user.html', locals())
 
 def index(request):
 
index 2440651..9633a29 100644 (file)
@@ -6,6 +6,7 @@
 <script type="text/javascript"> {# raw js code - use {% insert prelude_js %} ... {% endinsert %} #} {% container prelude_js %}</script>
 <style type="text/css">{# In case we need to add raw css code #}{% container prelude_css %}</style>
 {{ header_prelude }}
+{% block head %} {% endblock head %}
 </head>{# let's add these ones no matter what #}
 {# not yet needed {% insert_str prelude "css/layout-unfold1.css" %} #}
 {% insert_str prelude "js/jquery.min.js" %}