From 6d23a9fdace8c9be4d0625c82a6d39755f46b372 Mon Sep 17 00:00:00 2001 From: Abdallah Galal Date: Wed, 9 Nov 2016 18:31:12 +0200 Subject: [PATCH 1/3] Added support for skills for user profile #46: - Up to three skills upon registering a new user - First Skill is required - Second and Third skills are optional Modified the login and register urls in the main frame: - They refer to the actual login and register forms. --- mainapp/admin.py | 4 ++-- mainapp/forms.py | 38 +++++++++++++++++++++++++++++++------- mainapp/models.py | 6 ++++++ mainapp/views.py | 10 ++++++---- templates/base.html | 4 ++-- templates/user_reg.html | 1 + 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/mainapp/admin.py b/mainapp/admin.py index c9daa64..29e880d 100644 --- a/mainapp/admin.py +++ b/mainapp/admin.py @@ -1,9 +1,9 @@ from django.contrib import admin -from .models import Student, Project, ProjectSkills,UserProfile +from .models import Student, Project, ProjectSkills,UserProfile, UserSkills admin.site.register(Student) admin.site.register(UserProfile) admin.site.register(Project) admin.site.register(ProjectSkills) - +admin.site.register(UserSkills) diff --git a/mainapp/forms.py b/mainapp/forms.py index 8584072..1bfee95 100644 --- a/mainapp/forms.py +++ b/mainapp/forms.py @@ -1,7 +1,7 @@ from django import forms from django.contrib.auth.models import User from django.contrib.auth.forms import AuthenticationForm -from .models import Project, ProjectSkills, Student, UserProfile +from .models import Project, ProjectSkills, Student, UserProfile, UserSkills import datetime @@ -13,12 +13,12 @@ class LoginForm(AuthenticationForm): class RegistrationForm(forms.ModelForm): - first_name = forms.CharField(label='',required=True, widget=forms.TextInput(attrs={'placeholder': 'First_Name'})) - last_name = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': 'Last_Name'})) - username = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': 'UserName'})) - password1 = forms.CharField(label='', widget=forms.PasswordInput(attrs={'placeholder': 'Password'})) - password2 = forms.CharField(label='', widget=forms.PasswordInput(attrs={'placeholder': 'Re-Enter Password'})) - email = forms.EmailField(label='', widget=forms.EmailInput(attrs={'placeholder': 'Email'})) + first_name = forms.CharField(label='First Name',required=True, widget=forms.TextInput(attrs={'placeholder': 'First Name'})) + last_name = forms.CharField(label='Last Name', widget=forms.TextInput(attrs={'placeholder': 'Last Name'})) + username = forms.CharField(label='Username', widget=forms.TextInput(attrs={'placeholder': 'Username'})) + password1 = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'placeholder': 'Password'})) + password2 = forms.CharField(label='Verify Password', widget=forms.PasswordInput(attrs={'placeholder': 'Re-Enter Password'})) + email = forms.EmailField(label='Email', widget=forms.EmailInput(attrs={'placeholder': 'Email'})) class Meta: model = User @@ -65,6 +65,30 @@ class Meta: fields = ['u_gender', 'u_dob'] +class UserSkillsForm(forms.ModelForm): + first_skill = forms.CharField(label='Skill (1)', required=True, widget=forms.TextInput(attrs={'placeholder': 'Team Player, etc...'})) + second_skill = forms.CharField(label='Skill (2)', required=False, widget=forms.TextInput(attrs={'placeholder': 'Presenter, etc...'})) + third_skill = forms.CharField(label='Skill (3)', required=False, widget=forms.TextInput(attrs={'placeholder': 'Programming, etc...'})) + + + class Meta: + model = UserSkills + fields = ['first_skill', 'second_skill', 'third_skill'] + + def clean(self): + first_skill = self.cleaned_data['first_skill'] + second_skill = self.cleaned_data['second_skill'] + third_skill = self.cleaned_data['third_skill'] + if ( 'first_skill' in self.cleaned_data and 'second_skill' in self.cleaned_data \ + and 'third_skill' in self.cleaned_data ) and \ + ( self.cleaned_data['first_skill'] == self.cleaned_data['second_skill'] \ + or self.cleaned_data['first_skill'] == self.cleaned_data['third_skill'] \ + or (self.cleaned_data['second_skill'] == self.cleaned_data['third_skill'] and self.cleaned_data['third_skill'] != '') ): + raise forms.ValidationError("Skills cannot be matching.") + return self.cleaned_data + + + class ProjectForm(forms.ModelForm): CHOICES = [('B', 'Beginner'), ('I', 'Intermediate'), diff --git a/mainapp/models.py b/mainapp/models.py index a86887d..9910f31 100644 --- a/mainapp/models.py +++ b/mainapp/models.py @@ -54,3 +54,9 @@ class UserProfile(models.Model): def __str__(self): return self.user.username + +class UserSkills(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + + def __str__(self): + return self.user.username \ No newline at end of file diff --git a/mainapp/views.py b/mainapp/views.py index 0f96572..4fcd24a 100644 --- a/mainapp/views.py +++ b/mainapp/views.py @@ -1,5 +1,5 @@ from django.contrib import messages -from .forms import RegistrationForm, ProfileForm, ProjectForm,UserProfileForm, LoginForm +from .forms import RegistrationForm, ProfileForm, ProjectForm,UserProfileForm, LoginForm, UserSkillsForm from .forms import RegistrationForm, ProfileForm, ProjectForm, SearchForm from django.contrib.auth.models import User from django.shortcuts import render, redirect, get_object_or_404 @@ -49,7 +49,8 @@ def user_register(request): if request.method == 'POST': form = RegistrationForm(request.POST) #This will be used in POST request form_pro = ProfileForm(request.POST) - if form.is_valid() and form_pro.is_valid(): + skill_form = UserSkillsForm(request.POST) + if form.is_valid() and form_pro.is_valid() and skill_form.is_valid(): user = User.objects.create_user( username=form.cleaned_data['username'], email=form.cleaned_data['email'], @@ -67,10 +68,11 @@ def user_register(request): messages.error(request, "Error") else: - form = RegistrationForm() form_pro = ProfileForm() - return render(request, 'user_reg.html', {'form': form, 'form_pro': form_pro}) + skill_form = UserSkillsForm() + + return render(request, 'user_reg.html', {'form': form, 'skill_form': skill_form, 'form_pro': form_pro}) def profile_update(request): diff --git a/templates/base.html b/templates/base.html index cd88f4c..2243f1f 100644 --- a/templates/base.html +++ b/templates/base.html @@ -40,8 +40,8 @@ - Login - Register + Login + Register diff --git a/templates/user_reg.html b/templates/user_reg.html index b6e6b0c..8359dfb 100644 --- a/templates/user_reg.html +++ b/templates/user_reg.html @@ -5,6 +5,7 @@ {% csrf_token %} {{ form.as_p }} + {{ skill_form.as_p }} {{ form_pro.as_p }} From a43a39bceb815752406a7ebd5c3d2b79c4c2c52b Mon Sep 17 00:00:00 2001 From: Abdallah Galal Date: Wed, 9 Nov 2016 18:39:16 +0200 Subject: [PATCH 2/3] models.py missing info --- mainapp/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mainapp/models.py b/mainapp/models.py index 9910f31..dd5e508 100644 --- a/mainapp/models.py +++ b/mainapp/models.py @@ -56,7 +56,10 @@ def __str__(self): return self.user.username class UserSkills(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE) + user = models.OneToOneField(User, on_delete=models.CASCADE) + first_skill = models.TextField(max_length=100) + second_skill = models.TextField(max_length=100) + third_skill = models.TextField(max_length=100) def __str__(self): return self.user.username \ No newline at end of file From 2d1fdfa8e50919d778aad05ed5a3e9c4f3c32360 Mon Sep 17 00:00:00 2001 From: Abdallah Galal Date: Wed, 9 Nov 2016 18:52:32 +0200 Subject: [PATCH 3/3] models.py minor eof fix --- mainapp/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mainapp/models.py b/mainapp/models.py index dd5e508..e72114f 100644 --- a/mainapp/models.py +++ b/mainapp/models.py @@ -62,4 +62,5 @@ class UserSkills(models.Model): third_skill = models.TextField(max_length=100) def __str__(self): - return self.user.username \ No newline at end of file + return self.user.username + \ No newline at end of file