[cig-commits] r12530 - in cs/portal/trunk/northridge/SeismoWebPortal: . templates/SeismoWebPortal

leif at geodynamics.org leif at geodynamics.org
Tue Aug 5 18:34:17 PDT 2008


Author: leif
Date: 2008-08-05 18:34:17 -0700 (Tue, 05 Aug 2008)
New Revision: 12530

Added:
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/publication_info.html
Modified:
   cs/portal/trunk/northridge/SeismoWebPortal/forms.py
   cs/portal/trunk/northridge/SeismoWebPortal/management.py
   cs/portal/trunk/northridge/SeismoWebPortal/models.py
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html
   cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css
   cs/portal/trunk/northridge/SeismoWebPortal/views.py
Log:
Added "publication information" to registration form.


Modified: cs/portal/trunk/northridge/SeismoWebPortal/forms.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-08-05 21:49:55 UTC (rev 12529)
+++ cs/portal/trunk/northridge/SeismoWebPortal/forms.py	2008-08-06 01:34:17 UTC (rev 12530)
@@ -177,16 +177,6 @@
         return obj
 
 
-class RunStatusManipulator(forms.Manipulator):
-
-    def __init__(self):
-        self.fields = [
-            forms.TextField(field_name='status', is_required=True),
-            forms.FileUploadField(field_name='output'),
-            ]
-        return
-
-
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # Jobs
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -257,6 +247,12 @@
     return
 
 
+pubTypeChoices = (
+    (0, 'Background information'),
+    (1, 'Publication resulting from CIG software/resources'),
+    )
+
+
 class RegistrationManipulator(forms.Manipulator):
     
     def __init__(self):
@@ -293,9 +289,17 @@
             forms.TextField('username',     maxlength=30,  is_required=True, validator_list=self.usernameValidatorList()),
             forms.PasswordField('password1', maxlength=128, is_required=True),
             forms.PasswordField('password2', maxlength=128, is_required=True, validator_list=[passwordsMatch]),
-            # UserInfo
+            # project information
             forms.LargeTextField('projectAbstract', is_required=True),
             forms.IntegerField('requestedSUs', is_required=True),
+            # publication information
+            forms.RadioSelectField('pubType', choices=pubTypeChoices, is_required=True),
+            forms.TextField('authors', maxlength=100, is_required=True),
+            forms.TextField('title', maxlength=100, is_required=True),
+            forms.TextField('journal', maxlength=100, is_required=True),
+            forms.TextField('biblio', maxlength=100, is_required=True),
+            forms.FileUploadField(field_name='paper1'),
+            forms.FileUploadField(field_name='paper2'),
             ])
         
     def save(self, new_data, inviteCode):
@@ -333,8 +337,6 @@
             address2    = new_data['address2'],
             address3    = new_data['address3'],
             phone       = new_data['phone'],
-            projectAbstract  = new_data['projectAbstract'],
-            requestedSUs     = new_data['requestedSUs'],
             invite      = invite,
             approved    = approved,
             )
@@ -343,11 +345,38 @@
         user = authenticate(username=new_data['username'], password=new_data['password1'])
         if user is not None:
             login(self.request, user)
-        
-        return user, {}
 
+        pubType = new_data['pubType']
+        for value, displayName in pubTypeChoices:
+            if str(value) == pubType:
+                pubType = displayName
+                break
+        extraInfo = dict(
+            # project information
+            projectAbstract  = new_data['projectAbstract'],
+            requestedSUs     = new_data['requestedSUs'],
+            # publication information
+            pubType          = pubType,
+            authors          = new_data['authors'],
+            title            = new_data['title'],
+            journal          = new_data['journal'],
+            biblio           = new_data['biblio'],
+            )
+        attachments = []
+        for key in ['paper1', 'paper2']:
+            attachment = new_data.get(key)
+            if attachment:
+                attachments.append({
+                    'filename':     attachment['filename'],
+                    'content-type': attachment['content-type'],
+                    'content':      attachment['content'],
+                    })
+        extraInfo['attachments'] = attachments
+
+        return user, extraInfo, {}
+
     def flatten_data(self):
-        return {}
+        return {'pubType': 0}
     
     def usernameValidatorList(self):
         validator_list = super(RegistrationAddManipulator, self).usernameValidatorList()
@@ -399,7 +428,7 @@
         userInfo.phone       = new_data['phone']
         user.save()
         userInfo.save()
-        return user, {}
+        return user, None, {}
 
     def isUniqueEmail(self, field_data, all_data):
         try:

Modified: cs/portal/trunk/northridge/SeismoWebPortal/management.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/management.py	2008-08-05 21:49:55 UTC (rev 12529)
+++ cs/portal/trunk/northridge/SeismoWebPortal/management.py	2008-08-06 01:34:17 UTC (rev 12530)
@@ -290,7 +290,6 @@
                 institution  = "CIG",
                 phone        = "(626) 395-1699",
                 role         = -1,
-                requestedSUs = 0,
                 approved     = True,
                 )
     return

Modified: cs/portal/trunk/northridge/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-08-05 21:49:55 UTC (rev 12529)
+++ cs/portal/trunk/northridge/SeismoWebPortal/models.py	2008-08-06 01:34:17 UTC (rev 12530)
@@ -942,8 +942,6 @@
 
     role = models.IntegerField(choices=ROLE_CHOICES)
     adviser = models.CharField(maxlength=100, blank=True)
-    projectAbstract = models.TextField()
-    requestedSUs = models.IntegerField()
 
     # the invitation used, if any
     invite = models.ForeignKey(Invite, null=True, blank=True)

Added: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/publication_info.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/publication_info.html	                        (rev 0)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/publication_info.html	2008-08-06 01:34:17 UTC (rev 12530)
@@ -0,0 +1,46 @@
+
+    <p><i>We need to know of any published, in-press, or planned
+    papers you are generating that use the results of your work with
+    CIG's TeraGrid allocation.</i></p>
+
+    <div class="radio">
+        {{ form.pubType }}
+    </div>
+
+    <div>
+        <label for="id_authors" class=before>authors</label>
+        {{ form.authors }}
+        {% if form.authors.errors %}<span class=error>{{ form.authors.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_title" class=before>title</label>
+        {{ form.title }}
+        {% if form.title.errors %}<span class=error>{{ form.title.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_journal" class=before>journal</label>
+        {{ form.journal }}
+        {% if form.journal.errors %}<span class=error>{{ form.journal.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_biblio" class=before>vol./pages/year or DOI</label>
+        {{ form.biblio }}
+        {% if form.biblio.errors %}<span class=error>{{ form.biblio.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <p><i>Use the fields below to upload papers resulting from CIG software/resources.</i></p>
+
+    <div>
+        <label for="id_paper1" class=before>paper #1</label>
+        {{ form.paper1 }} {{ form.paper1_file }}
+        {% if form.paper1.errors %}<span class=error>{{ form.paper1.errors|join:", " }}</span>{% endif %}
+    </div>
+
+    <div>
+        <label for="id_paper2" class=before>paper #2</label>
+        {{ form.paper2 }} {{ form.paper2_file }}
+        {% if form.paper2.errors %}<span class=error>{{ form.paper2.errors|join:", " }}</span>{% endif %}
+    </div>

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html	2008-08-05 21:49:55 UTC (rev 12529)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/register.html	2008-08-06 01:34:17 UTC (rev 12530)
@@ -14,7 +14,7 @@
 <p><span class=error>Please correct the following error{{ form.error_dict|pluralize }}.</span>
 {% endif %}
 
-<form method="post" action="{{action}}">
+<form method="post" action="{{action}}" enctype="multipart/form-data">
 
     <div class=tab30ex>
 
@@ -49,7 +49,11 @@
     {% include "SeismoWebPortal/project_info.html" %}
     </fieldset>
 
+    <fieldset><legend>publication information</legend>
+    {% include "SeismoWebPortal/publication_info.html" %}
+    </fieldset>
 
+
     <div><input class=submit type="submit" value="Register"/></div>
 
     </div> <!-- tab30ex -->

Modified: cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css	2008-08-05 21:49:55 UTC (rev 12529)
+++ cs/portal/trunk/northridge/SeismoWebPortal/templates/SeismoWebPortal/style.css	2008-08-06 01:34:17 UTC (rev 12530)
@@ -443,7 +443,7 @@
 .blurb {
     font-style: italic;
     float: left;
-    width: 30ex;
+    width: 25ex;
 }
 
 input {

Modified: cs/portal/trunk/northridge/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-08-05 21:49:55 UTC (rev 12529)
+++ cs/portal/trunk/northridge/SeismoWebPortal/views.py	2008-08-06 01:34:17 UTC (rev 12530)
@@ -283,11 +283,12 @@
 
 
 def updateRunStatus(request, daemonCode, objectId):
-    from forms import RunStatusManipulator
-
     root = rootURL(request, "%s/runs/" % daemonCode)
 
-    manipulator = RunStatusManipulator()
+    manipulator = forms.Manipulator()
+    manipulator.fields.extend([
+        forms.TextField(field_name='status', is_required=True),
+        ])
 
     cluster = daemonConnect(daemonCode)
     run = get_object_or_404(models.ArchivedRun, id=objectId)
@@ -296,7 +297,6 @@
     if request.method == 'POST':
         response = HttpResponse(mimetype='text/plain')
         new_data = request.POST.copy()
-        new_data.update(request.FILES)
         errors = manipulator.get_validation_errors(new_data)
         if errors:
             response.write(repr(errors))
@@ -633,15 +633,16 @@
 
     if request.method == 'POST':
         new_data = request.POST.copy()
+        new_data.update(request.FILES)
         errors = manipulator.get_validation_errors(new_data)
         if not errors:
             manipulator.do_html2python(new_data)
-            user, errors = manipulator.save(new_data, inviteCode)
+            user, extraInfo, errors = manipulator.save(new_data, inviteCode)
             if not errors:
                 if isNewUser:
                     request.session.delete_test_cookie()
                     createExamplesForUser(user)
-                    notifyManagersOfNewUser(request, user)
+                    notifyManagersOfNewUser(request, user, extraInfo)
                     user.message_set.create(message="Welcome to the CIG Seismology Web Portal!")
                 else:
                     user.message_set.create(message="Your contact information has been saved.")
@@ -664,7 +665,7 @@
         ), RequestContext(request, {}))
 
 
-def notifyManagersOfNewUser(request, user):
+def notifyManagersOfNewUser(request, user, extraInfo):
     from django.core.mail import mail_managers
 
     userInfo = user.userinfo
@@ -694,17 +695,85 @@
         "phone: " + userInfo.phone,
         "invitation: " + str(invite),
         "",
-        "requested SUs: " + str(userInfo.requestedSUs),
+        "requested SUs: " + str(extraInfo['requestedSUs']),
         "project abstract:",
-        userInfo.projectAbstract,
+        extraInfo['projectAbstract'],
+        "",
+        "pubType: " + extraInfo['pubType'],
+        "authors: " + extraInfo['authors'],
+        "title: " + extraInfo['title'],
+        "journal: " + extraInfo['journal'],
+        "biblio: " + extraInfo['biblio'],
         ])
     message = "\n".join(message)
     
-    mail_managers(subject, message, fail_silently=True)
+    mailManagers(subject, message, extraInfo['attachments'], fail_silently=True)
     
     return
 
 
+def mailManagers(subject, message, attachments, fail_silently=False):
+    """Like django.core.mail.mail_managers, but with attachments."""
+    
+    from django.conf import settings
+    from django.core.mail import DNS_NAME
+    from email import Encoders
+    from email.MIMEBase import MIMEBase
+    from email.MIMEText import MIMEText
+    from email.MIMEMultipart import MIMEMultipart
+    from email.Utils import formatdate
+    import smtplib
+    import time
+    import random
+    
+    subject = settings.EMAIL_SUBJECT_PREFIX + subject
+    from_email = settings.SERVER_EMAIL or settings.DEFAULT_FROM_EMAIL
+    recipient_list = [a[1] for a in settings.MANAGERS]
+    if not recipient_list:
+        return
+    auth_user = settings.EMAIL_HOST_USER
+    auth_password = settings.EMAIL_HOST_PASSWORD
+    
+    try:
+        server = smtplib.SMTP(settings.EMAIL_HOST, settings.EMAIL_PORT)
+        if auth_user and auth_password:
+            server.login(auth_user, auth_password)
+    except:
+        if fail_silently:
+            return
+        raise
+
+    msg = MIMEMultipart()
+    msg['Subject'] = subject
+    msg['From'] = from_email
+    msg['To'] = ', '.join(recipient_list)
+    msg['Date'] = formatdate()
+    msg['Message-ID'] = "<%d.%s@%s>" % (time.time(), str(random.getrandbits(64)), DNS_NAME)
+
+    msg.attach(MIMEText(message, 'plain', settings.DEFAULT_CHARSET))
+    for attachment in attachments:
+        part = MIMEBase(*attachment['content-type'].split('/', 1))
+        part.set_payload(attachment['content'])
+        Encoders.encode_base64(part)
+        part.add_header('Content-Disposition', 'attachment', filename=attachment['filename'])
+        msg.attach(part)
+    
+    try:
+        server.sendmail(from_email, recipient_list, msg.as_string())
+    except:
+        if not fail_silently:
+            raise
+
+    try:
+        server.quit()
+    except:
+        if fail_silently:
+            return
+        raise
+
+    return
+
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # CPU time
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



More information about the cig-commits mailing list