[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