Skip to content

Commit

Permalink
#5 Added functionality in view and form to edit user information.
Browse files Browse the repository at this point in the history
  • Loading branch information
jcaraballo17 committed Apr 14, 2017
1 parent d6162b6 commit 0a2df44
Show file tree
Hide file tree
Showing 5 changed files with 240 additions and 16 deletions.
4 changes: 2 additions & 2 deletions src/WebSDL/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

from dataloader.models import Organization
from dataloaderinterface.forms import UserRegistrationForm
from dataloaderinterface.views import UserRegistrationView, UserAccountView
from dataloaderinterface.views import UserRegistrationView, UserUpdateView

BASE_URL = settings.SITE_URL[1:]

Expand Down Expand Up @@ -54,7 +54,7 @@
url(r'^' + BASE_URL + 'login/$', auth_views.login, login_configuration, name='login'),
url(r'^' + BASE_URL + 'logout/$', auth_views.logout, logout_configuration, name='logout'),
url(r'^' + BASE_URL + 'register/$', UserRegistrationView.as_view(), name='user_registration'),
url(r'^' + BASE_URL + 'account/$', UserAccountView.as_view(), name='user_account'),
url(r'^' + BASE_URL + 'account/$', UserUpdateView.as_view(), name='user_account'),
url(r'^' + BASE_URL + 'api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(BASE_URL, include('dataloaderinterface.urls')),
url(BASE_URL, include('dataloaderservices.urls')),
Expand Down
42 changes: 41 additions & 1 deletion src/dataloaderinterface/forms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from datetime import datetime

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
from django.db.models.query_utils import Q
from django.forms.formsets import formset_factory
from django.forms.models import ModelChoiceField
Expand Down Expand Up @@ -41,6 +42,45 @@ def save(self, commit=True):

return user

class Meta:
model = User
fields = ['first_name', 'last_name', 'email', 'username', 'organization']


class UserUpdateForm(UserChangeForm):
use_required_attribute = False

first_name = forms.CharField(required=True, max_length=50)
last_name = forms.CharField(required=True, max_length=50)
email = forms.EmailField(required=True, max_length=254)
organization = forms.ModelChoiceField(
queryset=Organization.objects.all().exclude(organization_type__in=['Vendor', 'Manufacturer']),
required=False,
help_text='Begin to enter the common name of your organization to choose from the list. If "No results found", then clear your entry, click on the drop-down-list to select "Add New Organization".')

def save(self, commit=True):
user = super(UserUpdateForm, self).save(commit=False)
organization = self.cleaned_data['organization']

if commit:
affiliation = user.odm2user.affiliation
person = affiliation.person

person.person_first_name = user.first_name
person.person_last_name = user.last_name
affiliation.primary_email = user.email
affiliation.organization = organization

user.save()
person.save()
affiliation.save()

return user

class Meta:
model = User
fields = ['first_name', 'last_name', 'email', 'password', 'username', 'organization']


# ODM2

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@

<ul class="nav navbar-nav navbar-right">
{% if user.is_authenticated %}
<li><a href="#" class="user-info"><i class="fa fa-user" aria-hidden="true"></i> Logged in as {{ user }}</a></li>
<li><a href="{% url 'user_account' %}"><i class="fa fa-user" aria-hidden="true"></i> Logged in as {{ user }}</a></li>
<li><a href="{% url 'logout' %}"><i class="fa fa-sign-out" aria-hidden="true"></i> Logout</a></li>
{% else %}
<li><a href="{% url 'login' %}"><i class="fa fa-sign-in" aria-hidden="true"></i> Log In</a></li>
Expand Down
178 changes: 168 additions & 10 deletions src/dataloaderinterface/templates/registration/account.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,168 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

</body>
</html>
{% extends "dataloaderinterface/base.html" %}
{% load widget_tweaks %}
{% load static %}

{% block page_title %}
<title>Join the EnviroDIY Data Portal</title>
{% endblock %}

{% block content %}
<div class="container">
<div class="row">
<section class="page-content user-registration col-lg-12">
<header>
{% if messages %}
{% for message in messages %}
<span class="form-message {{ message.tags }}">{{ message }}</span>
{% endfor %}
{% endif %}
</header>

<div class="row">
<div class="col-sm-12">
<div class="register-title text-shadow">
<h2 class="text-center">The Portal for Citizen Collected Water Quality Data</h2>
<h4 class="text-center">Share your data and view data contributed by others.</h4>
<br>
</div>

</div>
<div class="col-xs-12 col-sm-4 col-sm-offset-4">
<div class="panel panel-default panel-login shadow">
<div class="panel-heading">
<h3 class="panel-title">Sign Up</h3>
</div>
<div class="panel-body">
<form method="post" enctype="multipart/form-data" role="form">
{% csrf_token %}
<fieldset class="form-fieldset">
<div class="form-group user-fields">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="form-field required-field {% if form.first_name.errors %}has-error{% endif %}">
<label class="control-label" for="id_first_name"><i class="fa fa-user" aria-hidden="true"></i> Enter a first name</label>
{{ form.first_name|add_class:"form-control input-sm"|attr:"placeholder: First Name"|attr:"autofocus" }}
{{ form.first_name.errors }}
</div>
</div>

<div class="col-xs-12 col-sm-6">
<div class="form-field required-field {% if form.last_name.errors %}has-error{% endif %}">
<label class="control-label" for="id_last_name"><i class="fa fa-user" aria-hidden="true"></i> Enter a last name</label>
{{ form.last_name|add_class:"form-control input-sm"|attr:"placeholder: Last Name" }}
{{ form.last_name.errors }}
</div>
</div>

<div class="col-xs-12">
<div class="form-field required-field {% if form.email.errors %}has-error{% endif %}">
<label class="control-label" for="id_email_address"><i class="fa fa-envelope" aria-hidden="true"></i> Enter your email address</label>
{{ form.email|add_class:"form-control input-sm"|attr:"placeholder: Email Address" }}
{{ form.email.errors }}
</div>
</div>

<div class="col-xs-12">
<div class="form-field required-field {% if form.username.errors %}has-error{% endif %}">
<label class="control-label" for="id_username"><i class="fa fa-user-circle-o" aria-hidden="true"></i> Choose a username</label>
{{ form.username|add_class:"form-control input-sm"|attr:"placeholder: Username" }}
{{ form.username.errors }}
</div>
</div>

<div class="col-xs-12">
<div class="form-field {% if form.organization.errors %}has-error{% endif %}">
<label class="control-label" for="id_organization"><i class="fa fa-building" aria-hidden="true"></i> Organization</label>
<i id="organization-help" class="material-icons text-muted help-icon">help</i>
<div class="mdl-tooltip mdl-tooltip--large mdl-tooltip--right" data-mdl-for="organization-help">
{{ form.organization.help_text }}
</div>
{{ form.organization|add_class:"form-control input-sm select2-hidden-accessible"|attr:"placeholder: Choose your affiliated organization" }}
{{ form.organization.errors }}
</div>
</div>
</div>
</div>
</fieldset>

<div class="text-center">
<button type="submit" id="btn-login" value="Register User"
class="mdl-button mdl-js-button mdl-button--raised mdl-button--accent mdl-js-ripple-effect">
Update User
</button>
</div>

</form>
</div>
</div>
</div>
</div>


<div id="organization-dialog" class="modal fade" role="dialog" aria-hidden="true">
<div class="vertical-alignment-helper">
<div class="modal-dialog vertical-align-center">
<div class="modal-content">
<div class="modal-header">
<h4>New Organization</h4>
</div>
<div class="modal-body">
<div class="form-group col-lg-12 organization-fields">
{% for field in organization_form %}
<div class="form-field col-lg-12 {% if field.field.required %}required-field{% endif %} {% if field.errors %}has-error{% endif %}">
<label class="control-label" for="{{ field.id_for_label }}">{{ field.label }}</label> {{ field.errors }}
{% with "placeholder:"|add:field.help_text as placeholder %}
{{ field|add_class:"form-control input-sm"|attr:placeholder }}
{% endwith %}
</div>
{% endfor %}
</div>
<div class="clearfix"></div>
</div>
<div class="modal-footer">
<button id="organization-modal-close" type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button id="new-organization-button" type="button" class="btn btn-primary">Add New
Organization
</button>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>

<span id="bg-image" data-image-url="{% static "dataloaderinterface/images/signup_bg.jpg" %}" class="hidden"></span>


{% endblock %}

{% block services_urls %}
{{ block.super }}
<input id="new-organization-api" type="hidden" value="{% url 'organization_service' %}">
{% endblock %}

{% block styles %}
{{ block.super }}
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2-bootstrap-theme/0.1.0-beta.6/select2-bootstrap.min.css"
rel="stylesheet"/>
{% endblock %}

{% block scripts %}
{{ block.super }}
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.min.js"></script>
<script src="{% static 'dataloaderinterface/js/common-forms.js' %}"></script>
<script src="{% static 'dataloaderinterface/js/user-form.js' %}"></script>
<script src='https://www.google.com/recaptcha/api.js'></script>

<script>
$(document).ready(function () {
var path = $("#bg-image").attr("data-image-url");
$("#wrapper").css('background-image', 'url("' + path + '")');
$("#wrapper").css('background-size', 'cover');
$("#wrapper").css('background-repeat', 'no-repeat');
});
</script>
{% endblock %}
30 changes: 28 additions & 2 deletions src/dataloaderinterface/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
InstrumentOutputVariable, DataLoggerFileColumn
from dataloader.querysets import DataLoggerFileColumnManager
from dataloaderinterface.forms import SamplingFeatureForm, ResultFormSet, SiteForm, UserRegistrationForm, \
OrganizationForm
OrganizationForm, UserUpdateForm
from dataloaderinterface.models import DeviceRegistration


Expand All @@ -47,9 +47,35 @@ def get_context_data(self, **kwargs):
return context


class UserAccountView(TemplateView):
class UserUpdateView(UpdateView):
form_class = UserUpdateForm
template_name = 'registration/account.html'

def get_object(self, queryset=None):
return self.request.user

def get_form(self, form_class=None):
user = self.get_object()
organization = user.odm2user.affiliation.organization
form = UserUpdateForm(instance=user, initial={'organization': organization})
return form

def get_context_data(self, **kwargs):
context = super(UserUpdateView, self).get_context_data(**kwargs)
context['organization_form'] = OrganizationForm()
return context

def post(self, request, *args, **kwargs):
user = User.objects.get(pk=request.user.pk)
form = UserUpdateForm(request.POST, instance=user, initial={'organization': user.odm2user.affiliation.organization})
if form.is_valid():
form.save()
messages.success(request, 'Your information has been updated successfully.')
return HttpResponseRedirect(reverse('home'))
else:
messages.error(request, 'There were some errors in the form.')
return render(request, self.template_name, {'form': form})


class UserRegistrationView(CreateView):
template_name = 'registration/register.html'
Expand Down

0 comments on commit 0a2df44

Please sign in to comment.