summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--requirements.txt4
-rw-r--r--teams/models.py2
-rw-r--r--workshop_app/admin.py271
-rw-r--r--workshop_app/forms.py187
-rw-r--r--workshop_app/models.py293
-rw-r--r--workshop_app/static/workshop_app/css/base.css52
-rw-r--r--workshop_app/static/workshop_app/css/bootstrap4.min.css7
-rw-r--r--workshop_app/static/workshop_app/css/sticky-footer.css51
-rw-r--r--workshop_app/templates/workshop_app/activation.html111
-rw-r--r--workshop_app/templates/workshop_app/base.html177
-rw-r--r--workshop_app/templates/workshop_app/booking.html144
-rw-r--r--workshop_app/templates/workshop_app/create_workshop.html31
-rw-r--r--workshop_app/templates/workshop_app/how_to_participate.html65
-rw-r--r--workshop_app/templates/workshop_app/index.html214
-rw-r--r--workshop_app/templates/workshop_app/login.html47
-rw-r--r--workshop_app/templates/workshop_app/manage.html115
-rw-r--r--workshop_app/templates/workshop_app/my_workshops.html601
-rw-r--r--workshop_app/templates/workshop_app/password_change_done.html19
-rw-r--r--workshop_app/templates/workshop_app/password_change_form.html16
-rw-r--r--workshop_app/templates/workshop_app/password_reset_complete.html6
-rw-r--r--workshop_app/templates/workshop_app/password_reset_confirm.html15
-rw-r--r--workshop_app/templates/workshop_app/password_reset_done.html9
-rw-r--r--workshop_app/templates/workshop_app/password_reset_form.html14
-rw-r--r--workshop_app/templates/workshop_app/profile_updated.html19
-rw-r--r--workshop_app/templates/workshop_app/propose_workshop.html112
-rw-r--r--workshop_app/templates/workshop_app/registeration_error.html13
-rw-r--r--workshop_app/templates/workshop_app/registration/register.html3
-rw-r--r--workshop_app/templates/workshop_app/self_workshop.html101
-rw-r--r--workshop_app/templates/workshop_app/view_comment_profile.html135
-rw-r--r--workshop_app/templates/workshop_app/view_faq.html137
-rw-r--r--workshop_app/templates/workshop_app/view_profile.html124
-rw-r--r--workshop_app/templates/workshop_app/workshop_stats.html345
-rw-r--r--workshop_app/templates/workshop_app/workshop_type_details.html (renamed from workshop_app/templates/workshop_app/view_workshoptype_details.html)2
-rw-r--r--workshop_app/templates/workshop_app/workshop_type_list.html (renamed from workshop_app/templates/workshop_app/view_workshoptype_list.html)16
-rw-r--r--workshop_app/urls.py19
-rw-r--r--workshop_app/views.py1362
-rw-r--r--workshop_portal/settings.py36
-rw-r--r--workshop_portal/urls.py2
38 files changed, 1097 insertions, 3780 deletions
diff --git a/requirements.txt b/requirements.txt
index efa8668..47b970d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
-Django==1.9
-django-recurrence==1.4.1
+Django==3.0.5
+django-recurrence==1.10.2
packaging==16.8
python-dateutil==2.6.0
pytz==2016.10
diff --git a/teams/models.py b/teams/models.py
index c82a92c..b0f6fe4 100644
--- a/teams/models.py
+++ b/teams/models.py
@@ -5,5 +5,5 @@ from workshop_app.models import Profile
class Team(models.Model):
members = models.ManyToManyField(Profile)
- creator = models.OneToOneField(User)
+ creator = models.OneToOneField(User, on_delete=models.CASCADE)
created_date = models.DateTimeField(auto_now=True) \ No newline at end of file
diff --git a/workshop_app/admin.py b/workshop_app/admin.py
index 3eec8af..4e3d333 100644
--- a/workshop_app/admin.py
+++ b/workshop_app/admin.py
@@ -1,208 +1,131 @@
import csv
-from django.http import HttpResponse
+
from django.contrib import admin
+from django.http import HttpResponse
+
from .models import (
- Profile, WorkshopType,
- Workshop, ProposeWorkshopDate,
- RequestedWorkshop, BookedWorkshop,
- Testimonial, ProfileComments, Banner
- )
+ Profile, WorkshopType,
+ Workshop,
+ Testimonial, ProfileComments, Banner, AttachmentFile
+)
+
try:
from StringIO import StringIO as string_io
except ImportError:
from io import BytesIO as string_io
-#Custom Classes
+
+# Custom Classes
class ProfileAdmin(admin.ModelAdmin):
- list_display = ['title','user', 'institute','location','department',
- 'phone_number','position']
- list_filter = ['position', 'department']
- actions = ['download_csv']
-
- def download_csv(self, request, queryset):
- openfile = string_io()
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment;\
- filename=profile_data.csv'
-
- writer = csv.writer(response)
- writer.writerow(['email_id', 'title','username', 'first_name', 'last_name',
- 'institute', 'location', 'department',
- 'phone_number', 'position'])
-
- for q in queryset:
- writer.writerow([q.user.email, q.title, q.user, q.user.first_name,
- q.user.last_name, q.institute,
- q.location, q.department, q.phone_number,
- q.position])
-
- openfile.seek(0)
- response.write(openfile.read())
- return response
-
- download_csv.short_description = "Download CSV file for selected stats."
-
-
-class ProposeWorkshopDateAdmin(admin.ModelAdmin):
- list_display = ['proposed_workshop_title', 'proposed_workshop_date',
- 'proposed_workshop_coordinator', 'status',
- 'proposed_workshop_instructor']
- list_filter = ['status']
- actions = ['download_csv']
-
- def download_csv(self, request, queryset):
- openfile = string_io()
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment;\
- filename=proposedworkshop_data.csv'
-
- writer = csv.writer(response)
- writer.writerow(['proposed_workshop_title', 'proposed_workshop_date',
- 'proposed_workshop_coordinator', 'status','proposed_workshop_instructor'])
-
- for q in queryset:
- writer.writerow([q.proposed_workshop_title, q.proposed_workshop_date,
- q.proposed_workshop_coordinator, q.status,
- q.proposed_workshop_instructor])
-
- openfile.seek(0)
- response.write(openfile.read())
- return response
-
- download_csv.short_description = "Download CSV file for selected stats."
-
-
-class RequestedWorkshopAdmin(admin.ModelAdmin):
- list_display = ['requested_workshop_title',
- 'requested_workshop_date',
- 'requested_workshop_coordinator',
- 'requested_workshop_instructor',
- 'status']
-
- list_filter = ['status']
- actions = ['download_csv']
-
- def download_csv(self, request, queryset):
- openfile = string_io()
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment;\
- filename=requestedworkshop_data.csv'
-
- writer = csv.writer(response)
- writer.writerow(['requested_workshop_title',
- 'requested_workshop_date',
- 'requested_workshop_coordinator',
- 'requested_workshop_instructor',
- 'status'])
-
- for q in queryset:
- writer.writerow([q.requested_workshop_title,
- q.requested_workshop_date,
- q.requested_workshop_coordinator,
- q.requested_workshop_instructor,
- q.status])
-
- openfile.seek(0)
- response.write(openfile.read())
- return response
-
- download_csv.short_description = "Download CSV file for selected stats."
+ list_display = ['title', 'user', 'institute', 'location', 'department',
+ 'phone_number', 'position']
+ list_filter = ['position', 'department']
+ actions = ['download_csv']
+
+ def download_csv(self, request, queryset):
+ openfile = string_io()
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment;filename=profile_data.csv'
+ writer = csv.writer(response)
+ writer.writerow(['email_id', 'title', 'username', 'first_name', 'last_name',
+ 'institute', 'location', 'department',
+ 'phone_number', 'position'])
+ for q in queryset:
+ writer.writerow([q.user.email, q.title, q.user, q.user.first_name,
+ q.user.last_name, q.institute,
+ q.location, q.department, q.phone_number,
+ q.position])
+
+ openfile.seek(0)
+ response.write(openfile.read())
+ return response
+
+ download_csv.short_description = "Download CSV file for selected stats."
class WorkshopAdmin(admin.ModelAdmin):
- list_display = ['workshop_title','workshop_instructor']
- list_filter = ['workshop_title']
+ list_display = ['workshop_type', 'instructor', 'date', 'status', 'coordinator']
+ list_filter = ['workshop_type', 'date']
+ actions = ['download_csv']
+
+ def download_csv(self, request, queryset):
+ openfile = string_io()
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment;filename=workshop_data.csv'
+ writer = csv.writer(response)
+ writer.writerow(['workshop_type', 'date', 'instructor', 'coordinator', 'status'])
+
+ for q in queryset:
+ writer.writerow([q.title, q.date, q.instructor, q.coordinator, q.status])
+
+ openfile.seek(0)
+ response.write(openfile.read())
+ return response
+
+ download_csv.short_description = "Download CSV file for selected stats."
+
+
+class AttachmentFileInline(admin.TabularInline):
+ model = AttachmentFile
class WorkshopTypeAdmin(admin.ModelAdmin):
- list_display = ['workshoptype_name', 'workshoptype_duration']
- list_filter = ['workshoptype_name']
- actions = ['download_csv']
+ list_display = ['name', 'duration']
+ list_filter = ['name']
+ actions = ['download_csv']
+ inlines = [AttachmentFileInline]
- def download_csv(self, request, queryset):
- openfile = string_io()
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment;\
- filename=workshoptype_data.csv'
+ def download_csv(self, request, queryset):
+ openfile = string_io()
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment;filename=workshoptype_data.csv'
+ writer = csv.writer(response)
+ writer.writerow(['name', 'duration'])
- writer = csv.writer(response)
- writer.writerow(['workshoptype_name', 'workshoptype_duration'])
-
- for q in queryset:
- writer.writerow([q.workshoptype_name, q.workshoptype_duration])
+ for q in queryset:
+ writer.writerow([q.name, q.duration])
- openfile.seek(0)
- response.write(openfile.read())
- return response
-
- download_csv.short_description = "Download CSV file for selected stats."
+ openfile.seek(0)
+ response.write(openfile.read())
+ return response
+
+ download_csv.short_description = "Download CSV file for selected stats."
class TestimonialAdmin(admin.ModelAdmin):
- list_display = ['name', 'department', 'institute']
- list_filter = ['department']
- actions = ['download_csv']
-
- def download_csv(self, request, queryset):
- openfile = string_io()
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment;\
- filename=testimonials_data.csv'
-
- writer = csv.writer(response)
- writer.writerow(['name', 'department', 'institute'])
-
- for q in queryset:
- writer.writerow([q.name,
- q.department,
- q.institute
- ])
-
- openfile.seek(0)
- response.write(openfile.read())
- return response
-
- download_csv.short_description = "Download CSV file for selected stats."
-
-class BookedWorkshopAdmin(admin.ModelAdmin):
- list_display = ['booked_workshop_requested',
- 'booked_workshop_proposed']
- actions = ['download_csv']
-
- def download_csv(self, request, queryset):
- openfile = string_io()
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment;\
- filename=bookedworkshops_data.csv'
-
- writer = csv.writer(response)
- writer.writerow(['booked_workshop_requested',
- 'booked_workshop_proposed'])
-
- for q in queryset:
- writer.writerow([q.booked_workshop_requested,
- q.booked_workshop_proposed
- ])
-
- openfile.seek(0)
- response.write(openfile.read())
- return response
-
- download_csv.short_description = "Download CSV file for selected stats."
+ list_display = ['name', 'department', 'institute']
+ list_filter = ['department']
+ actions = ['download_csv']
+
+ def download_csv(self, request, queryset):
+ openfile = string_io()
+ response = HttpResponse(content_type='text/csv')
+ response['Content-Disposition'] = 'attachment;filename=testimonials_data.csv'
+ writer = csv.writer(response)
+ writer.writerow(['name', 'department', 'institute'])
+
+ for q in queryset:
+ writer.writerow([q.name,
+ q.department,
+ q.institute
+ ])
+
+ openfile.seek(0)
+ response.write(openfile.read())
+ return response
+ download_csv.short_description = "Download CSV file for selected stats."
class ProfileCommentAdmin(admin.ModelAdmin):
- list_display = ['comment', 'created_date', 'coordinator_profile', 'instructor_profile']
+ list_display = ['comment', 'created_date', 'coordinator', 'instructor']
# Register your models here.
admin.site.register(Profile, ProfileAdmin)
admin.site.register(WorkshopType, WorkshopTypeAdmin)
admin.site.register(Workshop, WorkshopAdmin)
-admin.site.register(ProposeWorkshopDate, ProposeWorkshopDateAdmin)
-admin.site.register(RequestedWorkshop, RequestedWorkshopAdmin)
-admin.site.register(BookedWorkshop, BookedWorkshopAdmin)
admin.site.register(Testimonial, TestimonialAdmin)
admin.site.register(ProfileComments, ProfileCommentAdmin)
admin.site.register(Banner)
+admin.site.register(AttachmentFile)
diff --git a/workshop_app/forms.py b/workshop_app/forms.py
index 68ada33..334bd4e 100644
--- a/workshop_app/forms.py
+++ b/workshop_app/forms.py
@@ -1,11 +1,10 @@
+from string import punctuation, digits
+
from django import forms
from django.utils import timezone
-from .models import (
- Profile, User, Workshop, WorkshopType,
- RequestedWorkshop, BookedWorkshop, ProposeWorkshopDate,
- ProfileComments
- )
-from string import punctuation, digits
+
+from .models import (Profile, Workshop, ProfileComments, department_choices, title, source, states)
+
try:
from string import letters
except ImportError:
@@ -15,86 +14,9 @@ from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from .send_mails import generate_activation_key
-
UNAME_CHARS = letters + "._" + digits
PWD_CHARS = letters + punctuation + digits
-position_choices = (
- ("coordinator", "Coordinator"),
- ("instructor", "Instructor")
- )
-
-department_choices = (
- ("computer engineering", "Computer Science"),
- ("information technology", "Information Technology"),
- ("civil engineering", "Civil Engineering"),
- ("electrical engineering", "Electrical Engineering"),
- ("mechanical engineering", "Mechanical Engineering"),
- ("chemical engineering", "Chemical Engineering"),
- ("aerospace engineering", "Aerospace Engineering"),
- ("biosciences and bioengineering", "Biosciences and BioEngineering"),
- ("electronics", "Electronics"),
- ("energy science and engineering", "Energy Science and Engineering"),
- )
-
-title = (
- ("Professor", "Prof."),
- ("Doctor", "Dr."),
- ("Shriman", "Shri"),
- ("Shrimati", "Smt"),
- ("Kumari", "Ku"),
- ("Mr", "Mr."),
- ("Mrs", "Mrs."),
- ("Miss", "Ms."),
- )
-
-source = (
- ("FOSSEE Email", "FOSSEE Email"),
- ("FOSSEE website", "FOSSEE website"),
- ("Google", "Google"),
- ("Social Media", "Social Media"),
- ("From other College", "From other College"),
- )
-
-states = (
- ("IN-AP", "Andhra Pradesh"),
- ("IN-AR", "Arunachal Pradesh"),
- ("IN-AS", "Assam"),
- ("IN-BR", "Bihar"),
- ("IN-CT", "Chhattisgarh"),
- ("IN-GA", "Goa"),
- ("IN-GJ", "Gujarat"),
- ("IN-HR", "Haryana"),
- ("IN-HP", "Himachal Pradesh"),
- ("IN-JK", "Jammu and Kashmir"),
- ("IN-JH", "Jharkhand"),
- ("IN-KA", "Karnataka"),
- ("IN-KL", "Kerala"),
- ("IN-MP", "Madhya Pradesh"),
- ("IN-MH", "Maharashtra"),
- ("IN-MN", "Manipur"),
- ("IN-ML", "Meghalaya"),
- ("IN-MZ", "Mizoram"),
- ("IN-NL", "Nagaland"),
- ("IN-OR", "Odisha"),
- ("IN-PB", "Punjab"),
- ("IN-RJ", "Rajasthan"),
- ("IN-SK", "Sikkim"),
- ("IN-TN", "Tamil Nadu"),
- ("IN-TG", "Telangana"),
- ("IN-TR", "Tripura"),
- ("IN-UT", "Uttarakhand"),
- ("IN-UP", "Uttar Pradesh"),
- ("IN-WB", "West Bengal"),
- ("IN-AN", "Andaman and Nicobar Islands"),
- ("IN-CH", "Chandigarh"),
- ("IN-DN", "Dadra and Nagar Haveli"),
- ("IN-DD", "Daman and Diu"),
- ("IN-DL", "Delhi"),
- ("IN-LD", "Lakshadweep"),
- ("IN-PY", "Puducherry")
- )
-
class UserRegistrationForm(forms.Form):
"""A Class to create new form for User's Registration.
@@ -106,19 +28,18 @@ class UserRegistrationForm(forms.Form):
period and underscore only.''')
email = forms.EmailField()
password = forms.CharField(max_length=32, widget=forms.PasswordInput())
- confirm_password = forms.CharField\
- (max_length=32, widget=forms.PasswordInput())
+ confirm_password = forms.CharField(max_length=32, widget=forms.PasswordInput())
title = forms.ChoiceField(choices=title)
first_name = forms.CharField(max_length=32)
last_name = forms.CharField(max_length=32)
- phone_number = forms.RegexField(regex=r'^.{10}$',
- error_messages={'invalid':"Phone number must be entered \
+ phone_number = forms.RegexField(regex=r'^.{10}$',
+ error_messages={'invalid': "Phone number must be entered \
in the format: '9999999999'.\
Up to 10 digits allowed."})
- institute = forms.CharField(max_length=128,
- help_text='Please write full name of your Institute/Organization')
+ institute = forms.CharField(max_length=128,
+ help_text='Please write full name of your Institute/Organization')
department = forms.ChoiceField(help_text='Department you work/study',
- choices=department_choices)
+ choices=department_choices)
location = forms.CharField(max_length=255, help_text="Place/City")
state = forms.ChoiceField(choices=states)
how_did_you_hear_about_us = forms.ChoiceField(choices=source)
@@ -126,7 +47,7 @@ class UserRegistrationForm(forms.Form):
def clean_username(self):
u_name = self.cleaned_data["username"]
if u_name.strip(UNAME_CHARS):
- msg = "Only letters, digits, period are"\
+ msg = "Only letters, digits, period are" \
" allowed in username"
raise forms.ValidationError(msg)
try:
@@ -170,48 +91,45 @@ class UserRegistrationForm(forms.Form):
new_profile = Profile(user=new_user)
new_profile.institute = cleaned_data["institute"]
new_profile.department = cleaned_data["department"]
- #new_profile.position = cleaned_data["position"]
new_profile.phone_number = cleaned_data["phone_number"]
new_profile.location = cleaned_data["location"]
new_profile.title = cleaned_data["title"]
new_profile.state = cleaned_data["state"]
- new_profile.how_did_you_hear_about_us = cleaned_data["how_did_you_hear_about_us" ]
+ new_profile.how_did_you_hear_about_us = cleaned_data["how_did_you_hear_about_us"]
new_profile.activation_key = generate_activation_key(new_user.username)
- new_profile.key_expiry_time = timezone.now() + \
- timezone.timedelta(days=1)
+ new_profile.key_expiry_time = timezone.now() + timezone.timedelta(days=1)
new_profile.save()
- key = Profile.objects.get(user=new_user).activation_key
- return u_name, pwd, key
+ return u_name, pwd, new_profile.activation_key
+
class UserLoginForm(forms.Form):
"""Creates a form which will allow the user to log into the system."""
username = forms.CharField(max_length=32,
- widget=forms.TextInput())
+ widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}))
password = forms.CharField(max_length=32,
- widget=forms.PasswordInput())
+ widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}))
def clean(self):
super(UserLoginForm, self).clean()
try:
- u_name, pwd = self.cleaned_data["username"],\
+ u_name, pwd = self.cleaned_data["username"], \
self.cleaned_data["password"]
user = authenticate(username=u_name, password=pwd)
except Exception:
- raise forms.ValidationError\
- ("Username and/or Password is not entered")
+ raise forms.ValidationError("Username and/or Password is not entered")
if not user:
raise forms.ValidationError("Invalid username/password")
return user
+
class ProfileForm(forms.ModelForm):
""" profile form for coordinator and instructor """
class Meta:
model = Profile
- fields = ['first_name', 'last_name', 'institute', 'department',
- ]
+ fields = ['first_name', 'last_name', 'institute', 'department']
first_name = forms.CharField(max_length=32)
last_name = forms.CharField(max_length=32)
@@ -223,48 +141,33 @@ class ProfileForm(forms.ModelForm):
self.fields['first_name'].initial = user.first_name
self.fields['last_name'].initial = user.last_name
-class CreateWorkshop(forms.ModelForm):
+
+class WorkshopForm(forms.ModelForm):
"""
- Instructors can create Workshops based on the Types
- of available workshops.
+ Coordinators will propose a workshop and date
"""
+ errorlist_css_class = 'errorlist'
- def __init__( self, *args, **kwargs ):
+ def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
- super(CreateWorkshop, self).__init__( *args, **kwargs )
- self.fields['recurrences'].label = " " #the trick to hide field :)
+ super(WorkshopForm, self).__init__(*args, **kwargs)
+ self.fields['tnc_accepted'].label = ""
+ self.fields['tnc_accepted'].required = True
+ self.fields['workshop_type'].label = "Workshop :"
+ self.fields['date'].label = "Workshop Date :"
class Meta:
model = Workshop
- fields = ['workshop_title', 'recurrences']
-
-
-class ProposeWorkshopDateForm(forms.ModelForm):
- """
- Coordinators will propose a workshop and date
- """
- errorlist_css_class = 'errorlist'
- def __init__( self, *args, **kwargs ):
- kwargs.setdefault('label_suffix', '')
- super(ProposeWorkshopDateForm, self).__init__(*args, **kwargs)
- self.fields['condition_one'].label = ""
- self.fields['condition_one'].required = True
- self.fields['condition_two'].label = ""
- self.fields['condition_two'].required = True
- self.fields['condition_three'].label = ""
- self.fields['condition_three'].required = True
- self.fields['proposed_workshop_title'].label = "Workshop :"
- self.fields['proposed_workshop_date'].label = "Workshop Date :"
-
- class Meta:
- model = ProposeWorkshopDate
- exclude = ['status', 'proposed_workshop_instructor',
- 'proposed_workshop_coordinator']
+ exclude = ['status', 'instructor', 'coordinator']
widgets = {
- 'proposed_workshop_date': forms.DateInput(attrs={
- 'class':'datepicker'})
- }
-
+ 'date': forms.DateInput(attrs={
+ 'class': 'datepicker form-control', 'placeholder': 'Workshop Date'}),
+ 'workshop_type': forms.Select(attrs={
+ 'class': 'form-control'}),
+ 'tnc_accepted': forms.CheckboxInput(attrs={
+ 'class': 'form-check-input'
+ })
+ }
class ProfileCommentsForm(forms.ModelForm):
@@ -281,8 +184,8 @@ class ProfileCommentsForm(forms.ModelForm):
class Meta:
model = ProfileComments
exclude = ['coordinator_profile', 'instructor_profile',
- 'created_date'
- ]
+ 'created_date'
+ ]
widgets = {
- 'comments' : forms.CharField(),
- } \ No newline at end of file
+ 'comments': forms.CharField(),
+ }
diff --git a/workshop_app/models.py b/workshop_app/models.py
index 4d589bf..b35d9a7 100644
--- a/workshop_app/models.py
+++ b/workshop_app/models.py
@@ -1,14 +1,14 @@
-from django.db import models
+import os
+
from django.contrib.auth.models import User
from django.core.validators import RegexValidator
-from recurrence.fields import RecurrenceField
+from django.db import models
from django.utils import timezone
-import os
position_choices = (
("coordinator", "Coordinator"),
("instructor", "Instructor")
- )
+)
department_choices = (
("computer engineering", "Computer Science"),
@@ -21,7 +21,7 @@ department_choices = (
("biosciences and bioengineering", "Biosciences and BioEngineering"),
("electronics", "Electronics"),
("energy science and engineering", "Energy Science and Engineering"),
- )
+)
title = (
("Professor", "Prof."),
@@ -32,53 +32,53 @@ title = (
("Mr", "Mr."),
("Mrs", "Mrs."),
("Miss", "Ms."),
- )
+)
source = (
("FOSSEE website", "FOSSEE website"),
("Google", "Google"),
("Social Media", "Social Media"),
("From other College", "From other College"),
- )
+)
states = (
- ("IN-AP", "Andhra Pradesh"),
- ("IN-AR", "Arunachal Pradesh"),
- ("IN-AS", "Assam"),
- ("IN-BR", "Bihar"),
- ("IN-CT", "Chhattisgarh"),
- ("IN-GA", "Goa"),
- ("IN-GJ", "Gujarat"),
- ("IN-HR", "Haryana"),
- ("IN-HP", "Himachal Pradesh"),
- ("IN-JK", "Jammu and Kashmir"),
- ("IN-JH", "Jharkhand"),
- ("IN-KA", "Karnataka"),
- ("IN-KL", "Kerala"),
- ("IN-MP", "Madhya Pradesh"),
- ("IN-MH", "Maharashtra"),
- ("IN-MN", "Manipur"),
- ("IN-ML", "Meghalaya"),
- ("IN-MZ", "Mizoram"),
- ("IN-NL", "Nagaland"),
- ("IN-OR", "Odisha"),
- ("IN-PB", "Punjab"),
- ("IN-RJ", "Rajasthan"),
- ("IN-SK", "Sikkim"),
- ("IN-TN", "Tamil Nadu"),
- ("IN-TG", "Telangana"),
- ("IN-TR", "Tripura"),
- ("IN-UT", "Uttarakhand"),
- ("IN-UP", "Uttar Pradesh"),
- ("IN-WB", "West Bengal"),
- ("IN-AN", "Andaman and Nicobar Islands"),
- ("IN-CH", "Chandigarh"),
- ("IN-DN", "Dadra and Nagar Haveli"),
- ("IN-DD", "Daman and Diu"),
- ("IN-DL", "Delhi"),
- ("IN-LD", "Lakshadweep"),
- ("IN-PY", "Puducherry")
- )
+ ("IN-AP", "Andhra Pradesh"),
+ ("IN-AR", "Arunachal Pradesh"),
+ ("IN-AS", "Assam"),
+ ("IN-BR", "Bihar"),
+ ("IN-CT", "Chhattisgarh"),
+ ("IN-GA", "Goa"),
+ ("IN-GJ", "Gujarat"),
+ ("IN-HR", "Haryana"),
+ ("IN-HP", "Himachal Pradesh"),
+ ("IN-JK", "Jammu and Kashmir"),
+ ("IN-JH", "Jharkhand"),
+ ("IN-KA", "Karnataka"),
+ ("IN-KL", "Kerala"),
+ ("IN-MP", "Madhya Pradesh"),
+ ("IN-MH", "Maharashtra"),
+ ("IN-MN", "Manipur"),
+ ("IN-ML", "Meghalaya"),
+ ("IN-MZ", "Mizoram"),
+ ("IN-NL", "Nagaland"),
+ ("IN-OR", "Odisha"),
+ ("IN-PB", "Punjab"),
+ ("IN-RJ", "Rajasthan"),
+ ("IN-SK", "Sikkim"),
+ ("IN-TN", "Tamil Nadu"),
+ ("IN-TG", "Telangana"),
+ ("IN-TR", "Tripura"),
+ ("IN-UT", "Uttarakhand"),
+ ("IN-UP", "Uttar Pradesh"),
+ ("IN-WB", "West Bengal"),
+ ("IN-AN", "Andaman and Nicobar Islands"),
+ ("IN-CH", "Chandigarh"),
+ ("IN-DN", "Dadra and Nagar Haveli"),
+ ("IN-DD", "Daman and Diu"),
+ ("IN-DL", "Delhi"),
+ ("IN-LD", "Lakshadweep"),
+ ("IN-PY", "Puducherry")
+)
def has_profile(user):
@@ -87,32 +87,31 @@ def has_profile(user):
def attachments(instance, filename):
- return os.sep.join((instance.workshoptype_name.replace(" ", '_'), filename))
+ return os.sep.join((instance.workshop_type.name.replace(" ", '_'), filename))
class Profile(models.Model):
"""Profile for users(instructors and coordinators)"""
- user = models.OneToOneField(User)
- title = models.CharField(max_length=32,blank=True, choices=title)
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ title = models.CharField(max_length=32, blank=True, choices=title)
institute = models.CharField(max_length=150)
department = models.CharField(max_length=150, choices=department_choices)
phone_number = models.CharField(
- max_length=10,
- validators=[RegexValidator(
- regex=r'^.{10}$', message=(
- "Phone number must be entered \
- in the format: '9999999999'.\
- Up to 10 digits allowed.")
- )]
- ,null=False)
+ max_length=10,
+ validators=[RegexValidator(
+ regex=r'^.{10}$', message=(
+ "Phone number must be entered \
+ in the format: '9999999999'.\
+ Up to 10 digits allowed.")
+ )], null=False)
position = models.CharField(max_length=32, choices=position_choices,
- default='coordinator',
- help_text='Select Coordinator if you want to organise a workshop\
+ default='coordinator',
+ help_text='Select Coordinator if you want to organise a workshop\
in your college/school. <br> Select Instructor if you want to conduct\
a workshop.')
- how_did_you_hear_about_us = models.CharField(max_length=255, blank=True,choices=source)
- location = models.CharField(max_length=255,blank=True, help_text="Place/City")
+ how_did_you_hear_about_us = models.CharField(max_length=255, blank=True, choices=source)
+ location = models.CharField(max_length=255, blank=True, help_text="Place/City")
state = models.CharField(max_length=255, choices=states, default="IN-MH")
is_email_verified = models.BooleanField(default=False)
activation_key = models.CharField(max_length=255, blank=True, null=True)
@@ -120,11 +119,11 @@ class Profile(models.Model):
def __str__(self):
return u"id: {0}| {1} {2} | {3} ".format(
- self.user.id,
- self.user.first_name,
- self.user.last_name,
- self.user.email
- )
+ self.user.id,
+ self.user.first_name,
+ self.user.last_name,
+ self.user.email
+ )
class WorkshopType(models.Model):
@@ -132,126 +131,55 @@ class WorkshopType(models.Model):
to create workshops.
"""
- workshoptype_name = models.CharField(max_length=120)
- workshoptype_description = models.TextField()
- workshoptype_duration = models.CharField(max_length=32,
- help_text='Please write this in \
+ name = models.CharField(max_length=120)
+ description = models.TextField()
+ duration = models.CharField(max_length=32,
+ help_text='Please write this in \
following format eg: 3days, 8hours a day')
- workshoptype_attachments = models.FileField(upload_to=attachments, blank=True,
- help_text='Please upload workshop documents one by one, \
- ie.workshop schedule, instructions etc. \
- Please Note: Name of Schedule file should be similar to \
- WorkshopType Name')
+ terms_and_conditions = models.TextField()
def __str__(self):
- return u"{0} {1}".format(self.workshoptype_name,
- self.workshoptype_duration
- )
-
-
-class Workshop(models.Model):
- """Instructor Creates workshop based on
- WorkshopTypes available"""
-
- workshop_instructor = models.ForeignKey(User, on_delete=models.CASCADE)
- workshop_title = models.ForeignKey(
- WorkshopType, on_delete=models.CASCADE,
- help_text=' [Select the type of workshop.] '
- )
- #For recurring workshops source: django-recurrence
- recurrences = RecurrenceField()
-
- def __str__(self):
- return u"{0} | {1} ".format(
- self.workshop_title,
- self.workshop_instructor
- )
-
-
-class RequestedWorkshop(models.Model):
- """
- Contains Data of request for Workshops
- """
+ return u"{0} {1}".format(self.name,
+ self.duration
+ )
- requested_workshop_instructor = models.ForeignKey(
- User,
- on_delete=models.CASCADE
- )
- requested_workshop_coordinator = models.ForeignKey(
- User,
- related_name="%(app_label)s_%(class)s_related"
- )
- requested_workshop_date = models.DateField()
- status = models.CharField(
- max_length=32, default="Pending"
- )
- requested_workshop_title = models.ForeignKey(
- WorkshopType,
- on_delete=models.CASCADE
- )
- def __str__(self):
- return u"{0} | {1} | {2}| {3}".format(
- self.requested_workshop_date,
- self.requested_workshop_title,
- self.requested_workshop_coordinator,
- self.status
- )
+class AttachmentFile(models.Model):
+ attachments = models.FileField(upload_to=attachments, blank=True,
+ help_text='Please upload workshop documents one by one, \
+ ie.workshop schedule, instructions etc. \
+ Please Note: Name of Schedule file should be similar to \
+ WorkshopType Name')
+ workshop_type = models.ForeignKey(WorkshopType, on_delete=models.CASCADE)
-class ProposeWorkshopDate(models.Model):
+class Workshop(models.Model):
"""
- Contains details of proposed date and workshop from coordinator
+ Contains details of workshops
"""
-
- condition_one = models.BooleanField(default=False, help_text='We assure to\
- give minimum 25 participants for the workshop.')
- condition_two = models.BooleanField(default=False, help_text='We agree \
- that this booking won\'t be cancelled without \
- 2days of prior notice to the instructor and fossee.')
- condition_three = models.BooleanField(default=False, help_text='This \
- proposal is subject to FOSSEE and instructor approval.')
-
- proposed_workshop_coordinator = models.ForeignKey(
- User,
- on_delete=models.CASCADE
- )
- proposed_workshop_instructor = models.ForeignKey(User, null=True,
- related_name="%(app_label)s_%(class)s_related")
-
- proposed_workshop_title = models.ForeignKey(
- WorkshopType, on_delete=models.CASCADE,
- help_text='Select the type of workshop.'
- )
-
- proposed_workshop_date = models.DateField()
-
- status = models.CharField(
- max_length=32, default="Pending"
- )
+ coordinator = models.ForeignKey(User, on_delete=models.CASCADE)
+ instructor = models.ForeignKey(User, null=True, related_name="%(app_label)s_%(class)s_related",
+ on_delete=models.CASCADE)
+ workshop_type = models.ForeignKey(WorkshopType, on_delete=models.CASCADE, help_text='Select the type of workshop.')
+ date = models.DateField()
+ STATUS_CHOICES = [(0, 'Pending'),
+ (1, 'Accepted'),
+ (2, 'Deleted')]
+
+ status = models.IntegerField(choices=STATUS_CHOICES, default=0)
+ tnc_accepted = models.BooleanField(help_text="I accept the terms and conditions")
def __str__(self):
- return u"{0} | {1} | {2}| {3}".format(
- self.proposed_workshop_date,
- self.proposed_workshop_title,
- self.proposed_workshop_coordinator,
- self.status
- )
-
-
-class BookedWorkshop(models.Model):
- """
- Contains details about Confirmed Booked/Completed Workshops
- """
-
- booked_workshop_requested = models.ForeignKey(RequestedWorkshop, null=True)
- booked_workshop_proposed = models.ForeignKey(ProposeWorkshopDate,null=True)
+ return u"{0} | {1} | {2} | {3} | {4}".format(
+ self.date,
+ self.workshop_type,
+ self.coordinator,
+ self.instructor,
+ self.STATUS_CHOICES[self.status][1]
+ )
- def __str__(self):
- return u"{0} | {1} |".format(
- self.booked_workshop_requested,
- self.booked_workshop_proposed
- )
+ def get_status(self):
+ return str(self.STATUS_CHOICES[self.status][1])
class Testimonial(models.Model):
@@ -266,11 +194,10 @@ class Testimonial(models.Model):
def __str__(self):
return u"{0} | {1} ".format(
- self.name,
- self.institute,
- self.department
- )
-
+ self.name,
+ self.institute,
+ self.department
+ )
class ProfileComments(models.Model):
@@ -278,21 +205,21 @@ class ProfileComments(models.Model):
Contains comments posted by instructors on coordinator profile
"""
- coordinator_profile = models.ForeignKey(User,
- on_delete=models.CASCADE)
+ coordinator = models.ForeignKey(User,
+ on_delete=models.CASCADE)
comment = models.TextField()
- instructor_profile = models.ForeignKey(User,
- related_name="%(app_label)s_%(class)s_related")
+ instructor = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_related", on_delete=models.CASCADE)
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return u"{0} | {1}".format(
self.comment,
self.created_date,
- self.coordinator_profile,
- self.instructor_profile
+ self.coordinator,
+ self.instructor
)
+
class Banner(models.Model):
"""
Add HTML for banner display on homepage
diff --git a/workshop_app/static/workshop_app/css/base.css b/workshop_app/static/workshop_app/css/base.css
new file mode 100644
index 0000000..0cd1f7a
--- /dev/null
+++ b/workshop_app/static/workshop_app/css/base.css
@@ -0,0 +1,52 @@
+/* Navbar */
+.navbar-custom {
+ background: linear-gradient(135deg, #2c5aa0, #2c5aa0 30%, #3bb1d1);
+ color: black;
+ border-radius: 0;
+ margin-bottom: 20px;
+}
+
+/* Text color */
+.navbar-custom .navbar-nav > li > a {
+ color: #fff;
+}
+
+/* OnActive Tab */
+.navbar-custom .navbar-nav > .active > a {
+ color: black;
+ background: white;
+}
+
+.navbar-custom .navbar-nav > li > a:hover,
+.navbar-custom .navbar-nav > li > a:focus,
+.navbar-custom .navbar-nav > .active > a:hover,
+.navbar-custom .navbar-nav > .active > a:focus,
+.navbar-custom .navbar-nav > .open > a {
+ text-decoration: none;
+ background-color: #ffffff17;
+}
+
+/* Brand-CompanyName */
+.navbar-custom .navbar-brand {
+ color: #efefef;
+ background-color: #2c5aa0;
+}
+
+
+.navbar-custom .navbar-brand:hover {
+ color: white;
+}
+
+/**
+ * Footer Styles
+ */
+
+.footer {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background-color: #efefef;
+ text-align: center;
+ padding: 10px 0;
+}
diff --git a/workshop_app/static/workshop_app/css/bootstrap4.min.css b/workshop_app/static/workshop_app/css/bootstrap4.min.css
deleted file mode 100644
index 6561b6f..0000000
--- a/workshop_app/static/workshop_app/css/bootstrap4.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v4.0.0 (https://getbootstrap.com)
- * Copyright 2011-2018 The Bootstrap Authors
- * Copyright 2011-2018 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}
-/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/workshop_app/static/workshop_app/css/sticky-footer.css b/workshop_app/static/workshop_app/css/sticky-footer.css
deleted file mode 100644
index 09754ae..0000000
--- a/workshop_app/static/workshop_app/css/sticky-footer.css
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Navbar */
-.navbar-custom {
- background: linear-gradient(135deg , #2c5aa0,#2c5aa0 30%, #3bb1d1 );
- color:black;
- border-radius:0;
-}
-
-/* Text color */
-.navbar-custom .navbar-nav > li > a {
- color:#fff;
-}
-
-/* OnActive Tab */
-.navbar-custom .navbar-nav > .active > a {
- color: black;
- background: white;
-}
-
-.navbar-custom .navbar-nav > li > a:hover,
-.navbar-custom .navbar-nav > li > a:focus,
-.navbar-custom .navbar-nav > .active > a:hover,
-.navbar-custom .navbar-nav > .active > a:focus,
-.navbar-custom .navbar-nav > .open >a {
- text-decoration: none;
- background-color: #3bb1d1;
-}
-
-/* Brand-CompanyName */
-.navbar-custom .navbar-brand {
- color:#efefef;
- background-color: #2c5aa0;
-}
-
-
-.navbar-custom .navbar-brand:hover{
- color: white;
-}
-
-/**
- * Footer Styles
- */
-
-.footer {
-
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: #efefef;
- text-align: center;
-}
diff --git a/workshop_app/templates/workshop_app/activation.html b/workshop_app/templates/workshop_app/activation.html
index dc6114a..fb8de48 100644
--- a/workshop_app/templates/workshop_app/activation.html
+++ b/workshop_app/templates/workshop_app/activation.html
@@ -1,23 +1,25 @@
{% extends 'workshop_app/base.html' %}
{% block title %}
- Awating activation
+ Awaiting activation
{% endblock %}
{% block header %}
- <nav class="navbar navbar-default navbar-custom">
- <div class="container-fluid">
- <div class="navbar-header">
- <a class="navbar-brand" href="#">FOSSEE Python Workshops</a>
- </div>
- <ul class="nav navbar-nav navbar-right">
- {% if request.user.profile.is_email_verified %}
- <li><a href="{{ URL_ROOT }}/view_profile/"><span class="glyphicon glyphicon-user"></span> Profile</a></li>
-
- <li><a href="{{ URL_ROOT }}/logout/"><span class="glyphicon glyphicon-log-out"></span> Logout</a></li>
- {% endif %}
- </ul>
- </div>
+ <nav class="navbar navbar-default navbar-custom">
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <a class="navbar-brand" href="#">FOSSEE Python Workshops</a>
+ </div>
+ <ul class="nav navbar-nav navbar-right">
+ {% if request.user.profile.is_email_verified %}
+ <li><a href="{{ URL_ROOT }}/view_profile/"><span class="glyphicon glyphicon-user"></span>
+ Profile</a></li>
+
+ <li><a href="{{ URL_ROOT }}/logout/"><span class="glyphicon glyphicon-log-out"></span> Logout</a>
+ </li>
+ {% endif %}
+ </ul>
+ </div>
</nav>
{% endblock %}
@@ -26,45 +28,46 @@
{% endblock %}
{% block content %}
- {% if status == '2' %}
- <div class="container">
- <div class="jumbotron">
- <p> Your email is already verified, Please view your profile <a href="{{ URL_ROOT }}/view_profile/">here</a> </p>
-
- </div>
- </div>
- {% elif status == '1' %}
- <script type="text/javascript">
- window.setTimeout(function()
- {
- location.href="{{ URL_ROOT }}/register/"
- }, 3000);
- </script>
- <div class="container">
- <div class="jumbotron">
- <p> Your activation has expired please register again</p>
- </div>
- </div>
- {% elif status == '0' %}
- <div class="container">
- <div class="jumbotron">
- <p> Your account has been activated. Please view your profile <a href="{{ URL_ROOT }}/view_profile/">here</a> </p>
-
- </div>
- </div>
- {% else %}
- <script type="text/javascript">
- window.setTimeout(function()
- {
- location.href="{{ URL_ROOT }}/logout/"
- }, 5000);
- </script>
+ {% if status == '2' %}
+ <div class="container">
+ <div class="jumbotron">
+ <p> Your email is already verified, Please view your profile <a
+ href="{{ URL_ROOT }}/view_profile/">here</a></p>
+
+ </div>
+ </div>
+ {% elif status == '1' %}
+ <script type="text/javascript">
+ window.setTimeout(function () {
+ location.href = "{{ URL_ROOT }}/register/"
+ }, 3000);
+ </script>
+ <div class="container">
+ <div class="jumbotron">
+ <p> Your activation has expired please register again</p>
+ </div>
+ </div>
+ {% elif status == '0' %}
+ <div class="container">
+ <div class="jumbotron">
+ <p> Your account has been activated. Please view your profile <a href="{{ URL_ROOT }}/view_profile/">here</a>
+ </p>
+
+ </div>
+ </div>
+ {% else %}
+ <script type="text/javascript">
+ window.setTimeout(function () {
+ location.href = "{{ URL_ROOT }}/logout/"
+ }, 5000);
+ </script>
- <div class="container">
- <div class="jumbotron">
- <h1>Activation Awaiting</h1>
- <p>The Activation Link has been sent to your email. The link expires in <strong>24hours</strong> from the date of registration. You will be logged out automatically.</p>
- </div>
- </div>
- {% endif %}
+ <div class="container">
+ <div class="jumbotron">
+ <h1>Activation Awaiting</h1>
+ <p>The Activation Link has been sent to your email. The link expires in <strong>24hours</strong> from
+ the date of registration. You will be logged out automatically.</p>
+ </div>
+ </div>
+ {% endif %}
{% endblock %}
diff --git a/workshop_app/templates/workshop_app/base.html b/workshop_app/templates/workshop_app/base.html
index af07689..c7a454e 100644
--- a/workshop_app/templates/workshop_app/base.html
+++ b/workshop_app/templates/workshop_app/base.html
@@ -1,100 +1,105 @@
<!DOCTYPE html>
<html>
<head>
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>
- {% block title %}
- HomePage
- {% endblock %}
- </title>
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>
+ {% block title %}
+ HomePage
+ {% endblock %}
+ </title>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
+ integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
- <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js">
- <link href="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js">
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/sticky-footer.css" type="text/css" />
+ <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"
+ integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n"
+ crossorigin="anonymous"></script>
+ <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
+ integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
+ crossorigin="anonymous"></script>
+ {% block extra-dependencies %}
+ {% endblock %}
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"
+ integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
+ crossorigin="anonymous"></script>
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
+ rel="stylesheet">
+ <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/base.css" type="text/css"/>
<!-- favicon -->
- <link rel="shortcut icon" type="image/png" href="{{ URL_ROOT}}/static/workshop_app/img/fevicon_python.png"/>
+ <link rel="shortcut icon" type="image/png" href="{{ URL_ROOT }}/static/workshop_app/img/fevicon_python.png"/>
+ {% block extra-custom-scripts %}
+ {% endblock %}
</head>
- <!-- For js/ajax and other related scripts -->
- {% block extra %}
- {% endblock %}
-
<body style="overflow: scroll;">
- {% block header %}
- <nav class="navbar navbar-default navbar-custom">
- <div class="container-fluid">
- {% if request.user.profile.position == 'instructor' %}
- <div class="navbar-header">
- <a class="navbar-brand" >FOSSEE Python Workshops</a>
- </div>
- <ul class="nav navbar-nav">
- <li><a href="{{ URL_ROOT }}/manage/">Manage Workshops</a></li>
- <li><a href="{{ URL_ROOT }}/create_workshop/">Create Workshop</a></li>
- <li><a href="{{ URL_ROOT }}/my_workshops/">Workshop Status</a></li>
- </ul>
- {% elif request.user.profile.position == 'coordinator' %}
- <div class="navbar-header">
- <a class="navbar-brand" >FOSSEE Python Workshops</a>
- </div>
- <ul class="nav navbar-nav">
- <li ><a href="{{ URL_ROOT }}/my_workshops/">Workshop Status</a></li>
- <li class="dropdown">
- <a class="dropdown-toggle" data-toggle="dropdown" href="#">Workshops
- <span class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><a href="{{ URL_ROOT }}/book/">Book a Workshop</a></li>
- <li><a href="{{ URL_ROOT }}/propose_workshop/">Propose a Workshop</a></li>
- </ul>
- </li>
- <li><a href="{{ URL_ROOT }}/view_workshoptype_list/"> Workshop List</a></li>
- </ul>
- {% else %}
- <div class="navbar-header">
- <a class="navbar-brand" href="{{ URL_ROOT }}/">FOSSEE Python Workshops</a>
- </div>
+{% block header %}
+ <nav class=" navbar-custom navbar navbar-expand-lg bg-light">
+ <a class="navbar-brand" href="/">FOSSEE Python Workshops</a>
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
+ aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
- {% endif %}
+ <div class="collapse navbar-collapse" id="navbarSupportedContent">
+ <ul class="navbar-nav mr-auto">
+ {% if request.user.profile.position == 'coordinator' %}
+ <li class="nav-item">
+ <a class="nav-link" href="/my_workshops/">Workshop Status</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/propose_workshop/">Propose Workshop</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/workshop_types/">Workshop Types</a>
+ </li>
+ {% elif request.user.profile.position == 'instructor' %}
+ <li class="nav-item">
+ <a class="nav-link" href="/my_workshops/">Workshop Status</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/workshop_types/">Workshop Types</a>
+ </li>
+ {% endif %}
+ </ul>
+ <div class="my-2 my-lg-0">
+ {% if user.is_authenticated %}
+ <ul class="navbar-nav mr-auto">
+ <li class="nav-item dropdown">
+ <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
+ data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span
+ class="material-icons" style="vertical-align: middle">account_circle</span>
+ &nbsp;<p
+ style="display: inline; vertical-align: middle">{{ user.first_name }} {{ user.last_name }}</p>
+ </a>
+ <div class="dropdown-menu" aria-labelledby="navbarDropdown">
+ <a class="dropdown-item" href="/view_profile/">Profile</a>
+ <a class="dropdown-item" href="/logout">Logout</a>
+ </div>
+ </li>
+ </ul>
+ {% else %}
+ <ul class="navbar-nav mr-auto">
+ <li class="nav-item">
+ <a class="nav-link" href="/register/">Register</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="/login/">Login</a>
+ </li>
+ </ul>
+ {% endif %}
+ </div>
+ </div>
+ </nav>
+{% endblock %}
- <ul class="nav navbar-nav navbar-right">
- {% if request.user.profile.position == 'instructor' %}
- <li><a href="{{ URL_ROOT }}/view_workshoptype_list/">Workshop List</a></li>
- <li class="dropdown">
- <a class="dropdown-toggle" data-toggle="dropdown" href="#">Statistics
- <span class="caret"></span></a>
- <ul class="dropdown-menu">
- <li><a href="{{ URL_ROOT }}/statistics/">Workshop Statistics</a></li>
- <li><a href="{{ URL_ROOT }}/statistics/profile_stats/">Profile Statistics</a></li>
- </ul>
- </li>
- <li><a href="{{ URL_ROOT }}/view_profile/"><span class="glyphicon glyphicon-user"></span> {{ user.first_name }} </a></li>
- <li><a href="{{ URL_ROOT }}/logout/"><span class="glyphicon glyphicon-log-out"></span> Logout</a></li>
- {% elif request.user.profile.position == 'coordinator' %}
- <li><a href="{{ URL_ROOT }}/how_to_participate/">How to Participate</a></li>
- <li><a href="{{ URL_ROOT }}/faq/">FAQ's</a></li>
- <li><a href="{{ URL_ROOT }}/view_profile/"><span class="glyphicon glyphicon-user"></span> {{ user.first_name }} </a></li>
- <li><a href="{{ URL_ROOT }}/logout/"><span class="glyphicon glyphicon-log-out"></span> Logout</a></li>
- {% else %}
- <li><a href="{{URL_ROOT}}/register">Register</a></li>
- <li><a href="{{URL_ROOT}}/login">Login</a></li>
- <li><a href="{{URL_ROOT}}/how_to_participate">How to Participate</a></li>
- <li ><a href="https://python.fossee.in/about" target="_blank">About Us</a></li>
- <li><a href="{{URL_ROOT}}/statistics/public_stats/">Stats</a></li>
- </ul>
- {% endif %}
- </div>
- </nav>
- {% endblock %}
+{% block content %}
+ <h1>Base Template Content. Please override me</h1>
+{% endblock %}
- {% block content %}
- <h1>Base Template Content. Please override me</h1>
- {% endblock %}
-
</body>
- <footer class="footer">
- <div class="container">
- <p align="center">Developed by FOSSEE group, IIT Bombay</p>
- </div>
- </footer>
+<footer class="footer">
+ <div class="container">
+ Developed by FOSSEE group, IIT Bombay
+ </div>
+</footer>
</html>
diff --git a/workshop_app/templates/workshop_app/booking.html b/workshop_app/templates/workshop_app/booking.html
deleted file mode 100644
index 8c2b2c3..0000000
--- a/workshop_app/templates/workshop_app/booking.html
+++ /dev/null
@@ -1,144 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-{% block title %}
- Book a Workshop
-{% endblock %}
-
-
-{% block extra %}
-
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
-
- <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
-
- <script>
- // Button function
- function sendData(d){
- var check_count;
- //For queue
- var URL = "{{ URL_ROOT }}/book_workshop/";
- c = d + ',0';
- $.ajax({
- url: URL,
- datatype: 'json',
- async: false,
- type: "POST",
- data: {
- c,
- csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val()
- },
- success:function(response){
- check_count = response;
- }
- });
-
- var $dialog = $('<div></div').html(
- '<form id="myform" action="">\
- <input type="checkbox" id="one"\
- name="one" value="one"/> We assure to give minimum 30 participants for the workshop.<br/>\
- <input type="checkbox" id="two" name="two" value="two" /> We agree that this booking won\'t be cancelled without prior notice of 2days to the instructor and fossee.<br/>\
- <input type="checkbox" id="three" name="three" value="three"/> Your request will be number '+ check_count +' in the queue.\
- </form> ')
- .dialog({
- autoOpen: false,
- title: 'Terms & Condition',
- buttons: {
- "Confirm": function(){
- if($('#one').is(":checked") && $('#two').is(":checked") && $('#three').is(":checked")){
- booking_confirmed(d);
- $(this).dialog("close");
- } else {
- alert("Please select all the checkboxes.");
- }
- },
- "Cancel": function(){
- $(this).dialog("close");
- }
- }
- });
- $dialog.dialog('open');
- }
-
- function booking_confirmed(d){
- var URL = "{{ URL_ROOT }}/book_workshop/";
-
- $.ajax({
- url: URL,
- type: "POST",
- data: {
- d,
- csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val()
- },
-
- success:function(response){
- window.location.reload();
- alert("success: " + response);
- }
- });
- }
- </script>
-{% endblock %}
-
-{% block content %}
- <h3 align="center">List of Available Workshops </h3>
- <br>
- <div class="container">
- <table class="table table-hover ">
- <thead>
- <tr>
- <th>Instructor Name</th>
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- <th>Booking</th>
- </tr>
- </thead>
- {% csrf_token %}
-
- {% for workshop in workshop_details %}
- <tbody>
-
- <tr >
- <td id="instructor-name">{{ workshop.1 }}</td>
- <td
- id="workshop-name">{{ workshop.2 }} <a href="{{URL_ROOT}}/file_view/{{workshop.4}}" >
- <span class="glyphicon glyphicon-info-sign"></span>
- </a> </td>
- <td id="workshop-date{{ forloop.counter }}">{{ workshop.0 }}</td>
- <td><button class="btn btn-primary btn-sm" id="book-btn" onClick="sendData('{{workshop.0}},{{workshop.3}},{{workshop.4}}')" > Book</button></td>
- </tr>
- </tbody>
- {% endfor %}
- </table>
- </div>
-
-
- <!-- Page Navigation -->
- <div class="container">
- <div class="Page-Nav" align="center">
- <nav aria-label="Page navigation">
- <ul class="pagination pagination-sm">
- <li class="page-item">
- {% if workshop_details.has_previous %}
- <a class="page-link" tabindex="-1"
- href="?page={{ workshop_details.previous_page_number }}">Previous</a>
- {% endif %}
- </li>
- <li class="page-item">
- <span class="current">
- Page {{ workshop_details.number }} of {{ workshop_details.paginator.num_pages }}
- </span>
- </li>
- <li class="page-item">
- {% if workshop_details.has_next %}
- <a class="page-link" href="?page={{ workshop_details.next_page_number }}">Next
- </a>
- {% endif %}
- </li>
- </ul>
- </nav>
- </div>
- </div>
-
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/create_workshop.html b/workshop_app/templates/workshop_app/create_workshop.html
deleted file mode 100644
index 3498da4..0000000
--- a/workshop_app/templates/workshop_app/create_workshop.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% extends "workshop_app/base.html" %}
-
-{% block title %}
- Create Workshop
-{% endblock %}
-
- {% block extra %}
- <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
- <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
- <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
- {% endblock %}
-
-
-{% block content %}
- <div class="container">
- <form method="post">
- {% csrf_token %}
- <br/>
- {{ form.media }}
- {{ form.as_p }}
- <br><br>
- <div class="alert alert-info">
- <strong>Please Note:!</strong> While Making Recurring Workshops please also fill <strong>Repeat Until </strong> and while creating single event please set it <strong>4days after the current date.</strong>
- </div>
- <br>
- <button class="btn btn-success" type="submit">Save</button>
- </form>
- </div>
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/how_to_participate.html b/workshop_app/templates/workshop_app/how_to_participate.html
deleted file mode 100644
index c23b178..0000000
--- a/workshop_app/templates/workshop_app/how_to_participate.html
+++ /dev/null
@@ -1,65 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-{% block title %}
- How to Participate
-{% endblock %}
-
-{% block extra %}
-
- <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> -->
-
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <link href='//fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
- <style>
- h1 {
- font-family: 'Open Sans';
- color: #2952a2;
- }
- h4 {
- font-family: 'Open Sans', 'Light';
- color: #04a9cf;
- padding-left: 5%;
- }
- img {
- display: block;
- margin: 0 auto;
- }
-
- #info {
-
- padding-left :6%;
- padding-right :6%;
-
- }
-
-
- </style>
-{% endblock %}
-
-
-{% block content %}
-
- <div class="container-fluid" id="info">
- <div class="row">
- <div class="col-12">
- <ul>
- <h1>Steps for conducting workshop</h1>
- <br>
- <h4><li>Register on this website as a Coordinator</li></h4>
- <h4><li>Login using your credentials and propose a workshop or select a workshop from the list of available workshops</li></h4>
- <h4><li>Wait for instructor approval till you receive a confirmation mail</li></h4>
- <h4><li>Once the workshop request/proposal is approved, instructor will send you other workshop details</li></h4>
- <h4> <li>Conduct the workshop</li></h4>
- </ul>
- </div>
- </div>
- <div class="row">
- <div class="col-12">
- <img style="width:auto ; height:auto; " class="img-responsive" src="{{ URL_ROOT }}/static/workshop_app/img/structure.png">
- </div>
- </div>
- <br><br>
- </div>
-
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/index.html b/workshop_app/templates/workshop_app/index.html
deleted file mode 100644
index 4880a2a..0000000
--- a/workshop_app/templates/workshop_app/index.html
+++ /dev/null
@@ -1,214 +0,0 @@
-
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="Akshen Doke" content="PRE, FOSSEE-IITB">
- <meta name="title" content="Welcome to FOSSEE's Python Workshops">
- <meta name="description" content="The FOSSEE team at IIT Bombay conducts remote-assisted training programs in Python.
- These are interactive workshop sessions with hands-on experience, live assistance, practice sessions and evaluation quizzes.
- These programs can be conducted at your institution / organisation, free of charge.
- Please note that you will require a coordinator and a minimum number of 25 participants to request for these workshops.">
- <meta name="keywords" content="learn python for free, fossee, iit bombay, python workshops, fossee python, python workshops">
- <!-- favicon -->
- <link rel="shortcut icon" type="image/png" href="{{ URL_ROOT}}/static/workshop_app/img/fevicon_python.png"/>
-
- <!-- <script src="{{ URL_ROOT }}/static/workshop_app/css/bootstrap4.min.css"></script> -->
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
-
-
- <!-- Custom CSS -->
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/index.css" type="text/css" />
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/sticky-footer.css" type="text/css" />
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/slick.css" type="text/css" />
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/slick-theme.css" type="text/css" />
-
- <!-- Add icon library -->
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
-
-
- <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
-<script type="text/javascript" src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
-
-<!-- Custom JS -->
-<script src="{{ URL_ROOT }}/static/workshop_app/js/index.js"></script>
-<script src="{{ URL_ROOT }}/static/workshop_app/js/slick.js"></script>
-
-<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
-
- <title>Welcome</title>
-
- <script>
- $(function() {
- $(".rslides").responsiveSlides({
- speed: "3000",
- });
- });
-
- $(function() {
- $(".tslides").responsiveSlides({
- speed: "1000",
- });
- });
- </script>
-
-<!-- Carousal(slick) -->
-<script>
-$(document).ready(function(){
- $('.slick_carousal').slick({
- infinite: true,
- slidesToShow: 3,
- slidesToScroll: 1
- });
-});
-</script>
-
-</head>
-<body>
- <div>
- {% if banners %}
- {% for banner in banners %}
- {% if banner.active %}
- {{ banner.html | safe}}
- {% endif %}
-
- <!--
- <center>
- <a href="https://fossee.in/fellowship/2019"><img
- src="https://static.fossee.in/fossee/banners/fellowship_2019_3.gif"/>
- </a>
- </center>
- -->
- {% endfor %}
- {% endif %}
- </div>
- <nav class="navbar navbar-expand-sm navbar-custom">
- <a class="navbar-brand">FOSSEE Python Workshops</a>
- <ul class=" nav navbar-nav ml-auto">
- <li class="nav-link"><a href="{{URL_ROOT}}/register"> Register</a></li>
- <li class="nav-link"><a href="{{URL_ROOT}}/login">Login</a></li>
- <li class="nav-link"><a href="{{URL_ROOT}}/how_to_participate">How to Participate</a></li>
- <li class="nav-link"><a href="https://python.fossee.in/about" target="_blank">About Us</a></li>
- <li class="nav-link"><a href="{{URL_ROOT}}/statistics/public_stats/">Stats</a></li>
- </ul>
- </nav>
-
-<div class="coverbox">
- <div class="row" id="r2">
- <div class="col-md-6 rslides" id="r2_c1">
-
- <img src="{{ URL_ROOT}}/static/workshop_app/img/intro_img_01.jpg" >
- <img src="{{ URL_ROOT}}/static/workshop_app/img/intro_img_02.jpg" >
- <img src="{{ URL_ROOT}}/static/workshop_app/img/intro_img_03.jpg" >
- <img src="{{ URL_ROOT}}/static/workshop_app/img/intro_img_04.jpg" >
- <img src="{{ URL_ROOT}}/static/workshop_app/img/intro_img_05.jpg" >
-
- </div>
-
- <div class="col-md-6" id="r2_c2">
- <video style="width: 100%;" controls>
- <source src="https://static.fossee.in/python/1-day-workshop/1_Introduction_to_Python.mp4" type="video/mp4">
- </video>
- </div>
-</div>
-
-<div class="row" id="r3">
- <div class="col-md-4" id="r3_c1"> <br>10000+ <br>Students Trained</div>
- <div class="col-md-4" id="r3_c2"><br>150+ <br> Colleges
- </div>
- <div class="col-md-4" id="r3_c3"><br> 33 hours of <br>Workshop Material</div>
-</div>
-
-
-<div class="row slick_carousal" id="r4" style="width:95%;">
- <div class="col-4">
- <br>
- <a href="{{URL_ROOT}}/view_workshoptype_details/1"><img src="{{ URL_ROOT}}/static/workshop_app/img/Crs_1.png"></a>
- </div>
- <div class="col-4">
- <br>
- <a href="{{URL_ROOT}}/view_workshoptype_details/2"><img src="{{ URL_ROOT}}/static/workshop_app/img/Crs_2.png"></a>
- </div>
- <div class="col-4">
- <br>
- <a href="{{URL_ROOT}}/self_workshop"><img src="{{ URL_ROOT}}/static/workshop_app/img/Crs_3.png"></a>
- </div>
-
- <div class="col-4">
- <br>
- <a href="{{URL_ROOT}}/view_workshoptype_details/3"><img src="{{ URL_ROOT}}/static/workshop_app/img/Crs_4.png"></a>
- </div>
-</div>
-
-<div class="row" id="r5">
- <div class="col-md-12" id="r5_c1">FOSSEE Python Workshop <span style="font-size: 3.5vw; color: #3bb1d1;">Advantage</span>
- </div>
-
- <div class="col-md-6" id="r5_c2"><img src="{{ URL_ROOT}}/static/workshop_app/img/icon_1.png"><br><br>
- <h5 style="color: #3bb1d1;">Learn Python for Free,</h5>
- <h5 style="color: #3bb1d1;">Many exercises/practice problems</h5> <br>
- <h5 style="color: #3bb1d1;"> Instructor support for your queries during workshop(s)</h5> <br>
- <h5 style="color: #3bb1d1;">Get e-certificate</h5>
-
- </div>
-
- <div class="col-md-6" id="r5_c3"><img src="{{ URL_ROOT}}/static/workshop_app/img/adv_img.png" style="width: 100%;"></div>
-</div>
-
-<div class="row" id="r6">
-
- <div class="col-12 tslides" id="r6_c2" >
- <li>{{ testimonials.0.message }} <br> <br>
- <span>~ {{testimonials.0.name}} ~<br>
- {{testimonials.0.institute}} </span></li>
- <li>{{testimonials.4.message}} <br><br>
- <span>~ {{testimonials.4.name}} ~ <br>
- {{testimonials.4.institute}}</span></li>
- <li>{{testimonials.3.message}} <br><br>
- <span>~ {{testimonials.3.name}} ~ <br>
- {{testimonials.3.institute}}</span></li>
- </div>
-
-</div>
-
-<div class="row" id="r7">
-
-</div>
-
-<div class="row" id="r8">
-
- <div class="col-md-4" id="r8_c1" >
- <br> <br>
- <img src="{{ URL_ROOT}}/static/workshop_app/img/fossee_logo_iitb.png" >
- </div>
-
- <div class="col-md-4" id="r8_c2" >
- <br> <br>
- FOSSEE,
- IIT-Bombay <br>Mumbai, India <br>
- Phone: (+91) 22 2576 4133 <br>
- Email: workshops[at]fossee[dot]in
- </div>
-
- <div class="col-md-4" id="r8_c3" >
- <div id="social">
- <br> <br>
- <a href="https://www.facebook.com/FOSSEENMEICT/" target="_blank" class="fa fa-facebook"></a> &nbsp;
- <a href="https://plus.google.com/u/0/104012350840765676803" target="_blank" class="fa fa-google"></a> &nbsp;
- <a href="https://www.youtube.com/channel/UCMtt6exSCmZI7JU73S6Wz_A" target="_blank" class="fa fa-youtube"></a>
- </div>
- </div>
-
- <div class="col-md-12" id="r8_c4">
- <hr>
- The FOSSEE project is funded by the National Mission on Education through ICT, MHRD, Government of India. <br>
- This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License
- <br><br>
- </div>
-</div>
-</div>
-
-</body>
-</html>
diff --git a/workshop_app/templates/workshop_app/login.html b/workshop_app/templates/workshop_app/login.html
index e5d5d78..63f2591 100644
--- a/workshop_app/templates/workshop_app/login.html
+++ b/workshop_app/templates/workshop_app/login.html
@@ -1,21 +1,34 @@
{% extends 'workshop_app/base.html' %}
- {% block title %}
- Login
- {% endblock %}
+{% block title %}
+ Login
+{% endblock %}
{% block content %}
- <div class="container" align="center">
- <br>
- <form method="post">
- {% csrf_token %}
- {{ form.as_p }}
- <br>
- <br>
- <button class="btn btn-info btn-sm" type="submit">Login</button>
- <a href="{{URL_ROOT}}/forgotpassword/" class="btn btn-default btn-sm" style="color:#3693C0;">Forgot Password</a>
- <br>
- </form>
- <br>
- </div>
- {% endblock %}
+ <div class="container" align="center">
+ <br>
+ <div class="col-md-6 col-md-offset-6">
+ <div class="card border-primary">
+ <div class="card-header">
+ <h3>Log in</h3>
+ </div>
+ <div class="card-body">
+ <div class="form-group">
+ <form method="post">
+ {% csrf_token %}
+ {{ form.username }}
+ <br>
+ {{ form.password }}
+ <br>
+ <button class="btn btn-success btn-md" style="width: 40%" type="submit">Login</button>
+ <br><br>
+ <a href="{{ URL_ROOT }}/forgotpassword/" class="btn btn-default btn-sm"
+ style="color:#3693C0;">Forgot Password</a>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+ <br>
+ </div>
+{% endblock %}
diff --git a/workshop_app/templates/workshop_app/manage.html b/workshop_app/templates/workshop_app/manage.html
deleted file mode 100644
index f2e1c5a..0000000
--- a/workshop_app/templates/workshop_app/manage.html
+++ /dev/null
@@ -1,115 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-
-{% block title %}
- Workshops
-{% endblock %}
-
-
-{% block extra %}
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
- <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
- <script>
- //ToolTip PopUp function onhover
- $(document).ready(function(){
- $('[data-toggle="popover"]').popover({
- placement : 'top',
- trigger : 'hover'
- });
- });
-
- function sendData(d){
- var URL = "{{ URL_ROOT }}/my_workshops/"
- console.log(d);
- $.ajax({
- url: URL,
- type: "POST",
- dataType: 'json',
- data: {
- d,
- csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val()
- },
- });
-
- window.location.reload();
- alert("Refreshing Page please wait, if you don't see your changes, please refresh this page again.");
- }
- </script>
-
-
-{% endblock %}
-
-
-{% block content %}
-
- {% if workshop_occurence_list %}
- <h4 align="center">This is the list of workshops you have created, you can delete a workshop if you are not availble on that day. </h4>
- <br>
- <div class="container">
- <table class="table table-hover">
- <thead>
- <tr>
- <th>Instructor Name</th>
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- </tr>
- </thead>
- {% csrf_token %}
- {% for w in workshop_occurence_list %}
- <tbody>
- <tr>
- <td>{{ w.user }}</td>
- <td>{{ w.workshop }}</td>
- <td>{{ w.date | date}}</td>
- <td><button class="btn btn-danger btn-sm" id="delete-btn" onClick="sendData('{{ w.user}},{{w.date | safe}},{{ w.workshop.id }},DELETED')" data-toggle="popover" title="Please Note" data-content="Once Deleted you cannot revoke this action." > Delete Workshop </button></td>
- </tr>
- </tbody>
- {% endfor %}
- </table>
- </div>
-
-<!-- Page Navigation -->
- <div class="container">
- <div class="Page-Nav" align="center">
- <nav aria-label="Page navigation">
- <ul class="pagination pagination-sm">
- <li class="page-item">
- {% if workshop_occurence_list.has_previous %}
- <a class="page-link" tabindex="-1"
- href="?page={{ workshop_occurence_list.previous_page_number }}">Previous</a>
- {% endif %}
- </li>
- <li class="page-item">
- <span class="current">
- Page {{ workshop_occurence_list.number }} of {{ workshop_occurence_list.paginator.num_pages }}
- </span>
- </li>
- <li class="page-item">
- {% if workshop_occurence_list.has_next %}
- <a class="page-link" href="?page={{ workshop_occurence_list.next_page_number }}">Next
- </a>
- {% endif %}
- </li>
- </ul>
- </nav>
- </div>
- </div>
-
- {% else %}
- <div class="container">
- <div class="jumbotron">
- <h1>Welcome {{ user.first_name }}</h1>
- <p>Please navigate to <b>View Workshop list</b> and depending upon
- your expertise and availability create a workshop by going to
- <b>Create Workshop</b>. you can also check any workshop
- requests by going to <b>Workshop Status</b></p>
-
- </div>
- </div>
- {% endif %}
-
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/my_workshops.html b/workshop_app/templates/workshop_app/my_workshops.html
index 417fa55..b6e3731 100644
--- a/workshop_app/templates/workshop_app/my_workshops.html
+++ b/workshop_app/templates/workshop_app/my_workshops.html
@@ -1,393 +1,234 @@
{% extends "workshop_app/base.html" %}
{% block title %}
- Workshop Status
+ Workshop Status
{% endblock %}
-{% block extra %}
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/jquery-1.12.1-ui.min.js"></script>
-
- <script>
- //ToolTip popup function onhover
- $(document).ready(function(){
- $('[data-toggle="popover"]').popover({
- placement : 'top',
- trigger : 'hover'
- });
- });
-
- function sendData(d){
- var URL = "{{ URL_ROOT }}/my_workshops/"
- $.ajax({
- url: URL,
- type: "POST",
- dataType: 'json',
- data: {
- d,
- csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val()
- },
- });
-
- window.location.reload();
- alert("Refreshing Page please wait, if you don't see your changes, please refresh this page again.");
- }
- </script>
-
- <!-- Change Workshop Date -->
- <script type="text/javascript">
- //ToolTip popup function onhover
- $(document).ready(function(){
- $('[data-toggle="popinfo"]').popover({
- placement : 'top',
- trigger : 'hover'
- });
- });
-
- function changeDate(date){
- var previous_date = new Date(date);
- var dateToday = new Date();
- var upto = new Date();
-
- previous_date.setDate(previous_date.getDate() + 1);
- upto.setFullYear(dateToday.getFullYear() + 1);
-
- if(date[0]=='P'){
- var counter = date.split(" ");
- var id = counter.slice(-1).pop();
- counter = '.pDate'+id
- $(counter).datepicker({
- changeMonth: true,
- changeYear: true,
- minDate: dateToday,
- maxDate: upto,
- dateFormat:"yy-mm-dd",
- });
- $(".ui-dialog-content").dialog("close");
- $('.myDialogP'+id).dialog();
-
- } else {
- var counter = date.split(" ");
- var id = counter.slice(-1).pop();
- counter = '.rDate'+id;
- $(counter).datepicker({
- changeMonth: true,
- changeYear: true,
- minDate: dateToday,
- maxDate: upto,
- dateFormat:"yy-mm-dd",
- });
- $(".ui-dialog-content").dialog("close");
- $('.myDialogR'+id).dialog();
-
- }
- };
-
- function submitNewDate(info){
- var data = info.split(",");
- if(data[1] == 'R'){
- var date = document.getElementsByClassName('rDate'+data[0]);
- info = data.slice(2);
- }
- else{
- var date = document.getElementsByClassName('pDate'+data[0]);
- info = data.slice(2);
- }
- var data_c = info + ',new_date=' + date[0].value +',CHANGE_DATE';
- var URL = "{{ URL_ROOT }}/my_workshops/";
- $.ajax({
- url: URL,
- async: false,
- type: "POST",
- data: {
- data_c,
- csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val()
- },
- success:function(response){
- window.location.reload();
- alert(response);
- }
- });
-
- };
+{% block extra-dependencies %}
+ <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
+ <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+{% endblock %}
+{% block extra-custom-scripts %}
+ <script>
+ //ToolTip popup function on-hover
+ $(document).ready(function () {
+ $('[data-toggle="popover"]').popover({
+ placement: 'top',
+ trigger: 'hover'
+ });
+ });
+
+ //ToolTip popup function on-hover
+ $(document).ready(function () {
+ $('[data-toggle="popinfo"]').popover({
+ placement: 'top',
+ trigger: 'hover'
+ });
+ });
+
+ // Change date modal
+ function changeDate(date) {
+ var previous_date = new Date(date);
+ var dateToday = new Date();
+ var upto = new Date();
+
+ previous_date.setDate(previous_date.getDate() + 1);
+ upto.setFullYear(dateToday.getFullYear() + 1);
+
+ if (date[0] == 'P') {
+ var counter = date.split(" ");
+ var id = counter.slice(-1).pop();
+ counter = '.pDate' + id
+ $(counter).datepicker({
+ changeMonth: true,
+ changeYear: true,
+ minDate: dateToday,
+ maxDate: upto,
+ dateFormat: "yy-mm-dd",
+ });
+ $(".ui-dialog-content").dialog("close");
+ $('.myDialogP' + id).dialog();
+
+ } else {
+ var counter = date.split(" ");
+ var id = counter.slice(-1).pop();
+ counter = '.rDate' + id;
+ $(counter).datepicker({
+ changeMonth: true,
+ changeYear: true,
+ minDate: dateToday,
+ maxDate: upto,
+ dateFormat: "yy-mm-dd",
+ });
+ $(".ui-dialog-content").dialog("close");
+ $('.myDialogR' + id).dialog();
+
+ }
+ };
</script>
{% endblock %}
{% block content %}
-{% if workshops %}
- <h3 align="center" style="color:#2952a2;">The status of your workshops </h3>
- <br>
-
- <!-- Pending View -->
- <div class="container">
- {% if request.user.profile.position == 'instructor'%}
- <h3 align="center" style="color: #04a9cf;"><strong><u>Team Member Requests</u></strong></h3>
-
- <table class="table">
- <thead>
- <tr>
- <th>Coordinator Name</th>
- <th>Team Member</th>
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- </tr>
- </thead>
- <tbody>
- {% for workshop in team_workshops %}
- <tr>
- <td><a href="{{ URL_ROOT }}/view_comment_profile/{{ workshop.proposed_workshop_coordinator.id }}">
- {{ workshop.proposed_workshop_coordinator.get_full_name }}</a>
- </td>
- <td>
- {{ workshop.proposed_workshop_instructor.get_full_name }}
- </td>
- <td>
- {{ workshop.proposed_workshop_title }}
- </td>
- <td>
- {{ workshop.proposed_workshop_date | date }}
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- {% endif %}
- {% if request.user.profile.position == 'instructor' %}
- <h3 align="center" style="color: #04a9cf;"><strong><u>Requests for Me</u></strong></h3>
- {% else %}
- <h3 align="center" style="color: #04a9cf;"><strong><u>My Requests</u></strong></h3>
- {% endif %}
- <table class="table table-striped">
- <thead>
- <tr>
- {% if request.user.profile.position == 'instructor' %}
- <th>Coordinator Name</th>
- {% else %}
- <th>Instructor Name</th>
- {% endif %}
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- <th>Status</th>
- </tr>
- </thead>
- {% csrf_token %}
- {% for workshop in workshops %}
- <tbody>
- <tr>
- {% if workshop.status == 'Pending' and workshop.requested_workshop_instructor %}
- {% if request.user.profile.position == 'instructor' %}
- <td><a href="{{ URL_ROOT }}/view_comment_profile/{{ workshop.requested_workshop_coordinator.profile.user.id }}">
- {{ workshop.requested_workshop_coordinator.get_full_name }}</a></td>
- {% else %}
- <td>{{ workshop.requested_workshop_instructor.get_full_name }}</td>
- {% endif %}
- <td>{{ workshop.requested_workshop_title }}</td>
- <td>{{ workshop.requested_workshop_date | date }}</td>
- <td><span class = "label label-warning">{{ workshop.status }}</span></td>
- {% endif %}
- {% if request.user.profile.position == 'instructor' and workshop.status == 'Pending' and workshop.requested_workshop_instructor %}
- <td><button class="btn btn-primary btn-sm" id="book-btn" onClick="sendData('{{workshop.requested_workshop_coordinator}},{{workshop.requested_workshop_date| safe}},{{ workshop.requested_workshop_title_id }},ACCEPTED')" data-toggle="popover" title="Please Note" data-content="Once Accepted you can't Reject, you have to personally contact the Coordinator if the workshop is to be cancelled"> Accept</button></td>
- <td><button class="btn btn-danger btn-sm" id="book-btn" onClick="sendData('{{workshop.requested_workshop_coordinator}},{{workshop.requested_workshop_date| safe}},{{ workshop.requested_workshop_title_id }},REJECTED')" data-toggle="popover" title="Please Note" data-content="Once Rejected you cannot revoke this action."> Reject </button></td>
- {% endif %}
- </tr>
- </tbody>
- {% endfor %}
- </table>
- </div>
-
- <!-- Accepted View -->
- <div class="container">
- <h3 align="center" style="color: #04a9cf;"><strong><u>Workshops Accepted</u></strong></h3>
- <table class="table table-striped">
- <thead>
- <tr>
- {% if request.user.profile.position == 'instructor' %}
- <th>Coordinator Name</th>
- <th>Institute</th>
- {% else %}
- <th>Instructor Name</th>
- {% endif %}
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- <th>Status</th>
- </tr>
- </thead>
- {% csrf_token %}
- {% for workshop in workshops %}
- <tbody>
- <tr>
- {% if workshop.status == 'ACCEPTED' and workshop.requested_workshop_title %}
- {% if request.user.profile.position == 'instructor' %}
- <td><a href="{{ URL_ROOT }}/view_comment_profile/{{ workshop.requested_workshop_coordinator.profile.user.id }}">
- {{ workshop.requested_workshop_coordinator.get_full_name }}</a></td>
- <td>{{ workshop.requested_workshop_coordinator.profile.institute }}</td>
- {% else %}
- <td>{{ workshop.requested_workshop_instructor.get_full_name }}</td>
- {% endif %}
- <td>{{ workshop.requested_workshop_title |capfirst }}</td>
- {% if workshop.requested_workshop_date > today %}
- <td>{{ workshop.requested_workshop_date | date }}
- <span class="glyphicon glyphicon-calendar" data-toggle="popinfo" title="Note" data-content="Click here to change date"
- class="datepicker" onclick="changeDate('R,{{ workshop.requested_workshop_date| safe}}, {{forloop.counter}}')">
- </span>
- <div class="myDialogR{{forloop.counter}}" style="display: none;" title="Select New Date">
-
- <input type="text" class="rDate{{forloop.counter}}" /><br>
- <button class="btn btn-primary btn-xs" type="submit" onclick="submitNewDate('{{forloop.counter}},R,{{workshop.requested_workshop_instructor_id}},{{workshop.requested_workshop_coordinator_id}},{{ workshop.requested_workshop_title_id }},{{ workshop.requested_workshop_date | safe}}')">Save</button>
- </div>
- </td>
- {% else %}
- <td>{{ workshop.requested_workshop_date | date }}</td>
- {% endif %}
- <td><span class = "label label-success">{{ workshop.status }}</span></td>
- {% endif %}
- {% if workshop.status == 'ACCEPTED' and workshop.condition_one %}
- {% if request.user.profile.position == 'instructor' %}
- <td><a href="{{ URL_ROOT }}/view_comment_profile/{{ workshop.proposed_workshop_coordinator.profile.user.id }}">
- {{ workshop.proposed_workshop_coordinator.get_full_name }}</a></td>
- <td>{{ workshop.proposed_workshop_coordinator.profile.institute }}</td>
- {% else %}
- <td>{{ workshop.proposed_workshop_instructor.get_full_name }}</td>
- {% endif %}
- <td>{{ workshop.proposed_workshop_title }}</td>
- {% if workshop.proposed_workshop_date > today %}
- <td>{{ workshop.proposed_workshop_date | date }}
- <span class="glyphicon glyphicon-calendar"
- class="datepicker" data-toggle="popinfo" title="Note" data-content="Click here to change date"
- onclick="changeDate('P,{{ workshop.proposed_workshop_date | safe}}, {{forloop.counter}}')">
- </span>
- <div class="myDialogP{{forloop.counter}}" style="display: none;" title="Select New Date">
-
- <input type="text" class="pDate{{forloop.counter}}" /><br>
- <button class="btn btn-primary btn-xs" type="submit" onclick="submitNewDate('{{forloop.counter}},P,{{workshop.proposed_workshop_instructor_id}},{{workshop.proposed_workshop_coordinator_id}},{{ workshop.proposed_workshop_title_id }},{{ workshop.proposed_workshop_date | safe}}')">Update</button>
- </div>
- </td>
- {% else %}
- <td>{{ workshop.proposed_workshop_date | date }}</td>
- {% endif %}
- <td><span class = "label label-success">{{ workshop.status }}</span></td>
- {% endif %}
- </tr>
- </tbody>
-
- {% endfor %}
-
- </table>
- </div>
-
-
-<!-- Proposed View -->
-<div class="container">
- {% if request.user.profile.position == 'instructor' %}
- <h3 align="center" style="color: #04a9cf;"><strong><u>Workshops Proposed By Coordinators</u></strong></h3>
- {% else %}
- <h3 align="center" style="color: #04a9cf;"><strong><u>Workshops Proposed By Me</u></strong></h3>
- {% endif %}
- <table class="table table-striped">
- <thead>
- <tr>
- {% if request.user.profile.position == 'instructor' %}
- <th>Coordinator Name</th>
- <th>Institute</th>
- {% else %}
-
- {% endif %}
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- <th>Status</th>
- </tr>
- </thead>
- {% csrf_token %}
- {% for workshop in workshops %}
- <tbody>
- <tr>
- {% if workshop.status == 'Pending' and workshop.condition_one %}
- {% if request.user.profile.position == 'instructor' %}
-
- <td><a href="{{ URL_ROOT }}/view_comment_profile/{{ workshop.proposed_workshop_coordinator.profile.user.id }}">
- {{ workshop.proposed_workshop_coordinator.get_full_name }}</a></td>
- <td>{{ workshop.proposed_workshop_coordinator.profile.institute }}</td>
- {% endif %}
- <td>{{ workshop.proposed_workshop_title }}</td>
- <td>{{ workshop.proposed_workshop_date | date }}</td>
-
- <td><span class = "label label-warning">{{ workshop.status }}</span></td>
- {% if request.user.profile.position == 'instructor' and workshop.status == 'Pending' %}
- <td><button class="btn btn-primary btn-sm" id="book-btn" onClick="sendData('{{workshop.proposed_workshop_coordinator}},{{workshop.proposed_workshop_date| safe}},{{ workshop.proposed_workshop_title_id }},APPROVED')" data-toggle="popover" title="Please Note" data-content="Once Accepted you can't Reject, you have to personally contact the Coordinator if the workshop is to be cancelled"> Accept</button></td>
- {% endif %}
- {% endif %}
- </tr>
- </tbody>
-
- {% endfor %}
- </table>
- </div>
-
-
-<!-- Deleted/Rejected View -->
-<div class="container">
- <h3 align="center" style="color: #04a9cf;"><strong><u>Workshops Deleted/Rejected</u></strong></h3>
- <table class="table table-striped">
- <thead>
- <tr>
- {% if request.user.profile.position == 'instructor' %}
- <th>Coordinator Name</th>
- {% else %}
- <th>Instructor Name</th>
- {% endif %}
- <th>Workshop Name</th>
- <th>Workshop Day</th>
- <th>Status</th>
- </tr>
- </thead>
- {% csrf_token %}
- {% for workshop in workshops %}
- <tbody>
- <tr>
- {% if workshop.status == 'DELETED' or workshop.status == 'REJECTED' %}
- {% if request.user.profile.position == 'instructor' %}
- <td>{{ workshop.requested_workshop_coordinator.get_full_name }}</td>
- {% else %}
- <td>{{ workshop.requested_workshop_instructor.get_full_name }}</td>
- {% endif %}
- <td>{{ workshop.requested_workshop_title | capfirst }}</td>
- <td>{{ workshop.requested_workshop_date | date }}</td>
-
- <td><span class = "label label-danger">{{ workshop.status }}</span></td>
- {% endif %}
- </tr>
- </tbody>
-
- {% endfor %}
- </table>
- </div>
-
-
-{% else %}
- {% if request.user.profile.position == 'instructor' %}
- <div class="container">
- <div class="jumbotron">
- <h1>Welcome {{ user.first_name }}</h1>
- <p>Your workshop related information will be shown here, Please navigate to <b>Workshop list</b> and depending upon
- your expertise and availability create a workshop by going to
- <b>Create Workshop</b>.</p>
- </div>
- </div>
- {% else %}
- <div class="container">
- <div class="jumbotron">
- <h1>Welcome {{ user.first_name }}</h1>
- <p>Information Related to your workshops will be shown here, you can also
- propose a Workshop as per your available date in <strong>Workshops > Propose a Workshop tab</strong> .</p>
- </div>
- </div>
- {% endif %}
-{% endif %}
+ {% if workshops %}
+ <h3 align="center" style="color:#2952a2;">The status of your workshops </h3>
+ <br>
+
+ <!-- Accepted View -->
+ <br>
+ <div class="container">
+ <h3 align="center" style="color: #04a9cf;"><strong>Workshops Accepted</strong></h3>
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ {% if request.user.profile.position == 'instructor' %}
+ <th>Coordinator Name</th>
+ <th>Institute</th>
+ {% else %}
+ <th>Instructor Name</th>
+ {% endif %}
+ <th>Workshop Name</th>
+ <th>Workshop Day</th>
+ <th>Status</th>
+ </tr>
+ </thead>
+ {% csrf_token %}
+ {% for workshop in workshops %}
+ <tbody>
+ <tr>
+ {% if workshop.status == 1 and workshop.workshop_type %}
+ {% if request.user.profile.position == 'instructor' %}
+ <td>
+ <a href="{{ URL_ROOT }}/view_profile/{{ workshop.coordinator.profile.user.id }}">
+ {{ workshop.coordinator.get_full_name }}</a></td>
+ <td>{{ workshop.coordinator.profile.institute }}</td>
+ {% else %}
+ <td>{{ workshop.instructor.get_full_name }}</td>
+ {% endif %}
+ <td>{{ workshop.workshop_type |capfirst }}</td>
+ {% if workshop.date > today %}
+ <td>{{ workshop.date | date }}
+ <span class="material-icons" style="cursor:pointer;" data-toggle="popinfo"
+ title="Note"
+ data-content="Click here to change date"
+ class="datepicker"
+ onclick="changeDate('R,{{ workshop.date| safe }}, {{ forloop.counter }}')">event</span>
+ <div class="myDialogR{{ forloop.counter }}" style="display: none;"
+ title="Select New Date">
+ <form method="post">
+ <input type="text" name="new_date" class="rDate{{ forloop.counter }}"/><br>
+ <input type="hidden" name="action" value="change_date">
+ <input type="hidden" name="workshop_id" value="{{ workshop.id }}">
+ <input type="hidden" name="cid" value="{{ workshop.coordinator.id }}">
+ {% csrf_token %}
+ <button class="btn btn-primary btn-xs" type="submit">Save</button>
+ </form>
+ </div>
+ </td>
+ {% else %}
+ <td>{{ workshop.date | date }}</td>
+ {% endif %}
+ <td><span class="badge badge-success">{{ workshop.get_status }}</span></td>
+ {% endif %}
+ </tr>
+ </tbody>
+
+ {% endfor %}
+
+ </table>
+ </div>
+
+
+ <!-- Proposed View -->
+ <br>
+ <div class="container">
+
+ {% if request.user.profile.position == 'instructor' %}
+ <h3 align="center" style="color: #04a9cf;"><strong>Workshops Proposed By Coordinators</strong>
+ </h3>
+ {% else %}
+ <h3 align="center" style="color: #04a9cf;"><strong>Workshops Proposed By Me</strong></h3>
+ {% endif %}
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ {% if request.user.profile.position == 'instructor' %}
+ <th>Coordinator Name</th>
+ <th>Institute</th>
+ {% else %}
+
+ {% endif %}
+ <th>Workshop Name</th>
+ <th>Workshop Day</th>
+ <th>Status</th>
+ {% if request.user.profile.position == 'instructor' %}
+ <th>Action</th>
+ {% endif %}
+ </tr>
+ </thead>
+ {% csrf_token %}
+ {% for workshop in workshops %}
+ <tbody>
+ <tr>
+ {% if workshop.status == 0 and workshop.tnc_accepted %}
+ {% if request.user.profile.position == 'instructor' %}
+
+ <td>
+ <a href="{{ URL_ROOT }}/view_comment_profile/{{ workshop.coordinator.profile.user.id }}">
+ {{ workshop.coordinator.get_full_name }}</a></td>
+ <td>{{ workshop.coordinator.profile.institute }}</td>
+ {% endif %}
+ <td>{{ workshop.workshop_type }}</td>
+ <td>{{ workshop.date | date }}</td>
+
+ <td><span class="badge badge-warning">{{ workshop.get_status }}</span></td>
+ {% if request.user.profile.position == 'instructor' and workshop.status == 0 %}
+ <td>
+ <form method="post">
+ <input type="hidden" name="action" value="accept">
+ <input type="hidden" name="workshop_id" value="{{ workshop.id }}">
+ {% csrf_token %}
+ <button class="btn btn-primary btn-sm" id="book-btn" data-toggle="popover"
+ title="Please Note"
+ data-content="Once Accepted you can't Reject, you have to personally contact the Coordinator if the workshop is to be cancelled">
+ Accept
+ </button>
+ </form>
+ </td>
+ {% endif %}
+ {% endif %}
+ </tr>
+ </tbody>
+
+ {% endfor %}
+ </table>
+ </div>
+
+
+
+ {% else %}
+ {% if request.user.profile.position == 'instructor' %}
+ <div class="container">
+ <div class="jumbotron">
+ <h1>Welcome {{ user.first_name }}</h1>
+ <p>Your workshop related information will be shown here, Please navigate to <b>Workshop list</b> and
+ depending upon
+ your expertise and availability create a workshop by going to
+ <b>Create Workshop</b>.</p>
+ </div>
+ </div>
+ {% else %}
+ <div class="container">
+ <div class="jumbotron">
+ <h1>Welcome {{ user.first_name }}</h1>
+ <p>Information Related to your workshops will be shown here, you can also
+ propose a Workshop as per your available date in <strong>Workshops > Propose a Workshop
+ tab</strong> .</p>
+ </div>
+ </div>
+ {% endif %}
+ {% endif %}
{% endblock %}
-
diff --git a/workshop_app/templates/workshop_app/password_change_done.html b/workshop_app/templates/workshop_app/password_change_done.html
deleted file mode 100644
index fc87389..0000000
--- a/workshop_app/templates/workshop_app/password_change_done.html
+++ /dev/null
@@ -1,19 +0,0 @@
-{% extends "base.html" %}
-
-{% block pagetitle %}
- Password change successful
-{% endblock %}
-
-{% block script %}
-<script type="text/javascript">
- window.setTimeout(function()
- {
- location.href="{{ URL_ROOT }}/login/"
- }, 2000);
-</script>
-{% endblock %}
-
-{% block content %}
- <h3>Your password has been changed successfully.</h3>
- <h4>Redirecting ...</h4>
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/password_change_form.html b/workshop_app/templates/workshop_app/password_change_form.html
deleted file mode 100644
index c5ed81a..0000000
--- a/workshop_app/templates/workshop_app/password_change_form.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{% extends "base.html" %}
-<!DOCTYPE html>
-{% block pagetitle %} Change Password {% endblock %}
-
-{% block content %}
-<form action="" method="post" >
- {% csrf_token %}
- <center>
- <table class=span1>
- {{ form }}
- </table>
- </center>
- <center><button class="btn" type="submit">Change Password</button>
- <button class="btn" type="button" name="button" onClick='location.replace("{{URL_ROOT}}/login/");'>Cancel</button></center>
-</form>
-{% endblock content %}
diff --git a/workshop_app/templates/workshop_app/password_reset_complete.html b/workshop_app/templates/workshop_app/password_reset_complete.html
deleted file mode 100644
index bf27059..0000000
--- a/workshop_app/templates/workshop_app/password_reset_complete.html
+++ /dev/null
@@ -1,6 +0,0 @@
-{% extends "base.html" %}
-{% block pagetitle %}Password reset complete{% endblock %}
-{% block content %}
-<p>Your password has been reset. </p>
-
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/password_reset_confirm.html b/workshop_app/templates/workshop_app/password_reset_confirm.html
deleted file mode 100644
index 1b0a1b7..0000000
--- a/workshop_app/templates/workshop_app/password_reset_confirm.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% extends "base.html" %}
-{% block pagetitle %}Reset Password{% endblock %}
-
-{% block content %}
- {% if validlink %}
- <p>Please enter your new password twice so we can verify you typed it in correctly</p>.
- <form method="post">
- {% csrf_token %}
- {{ form.as_p }}
- <button class= "btn" type="submit">Submit</button>
- </form>
- {% else %}
- <p>This reset link is no longer valid!</p>
- {% endif %}
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/password_reset_done.html b/workshop_app/templates/workshop_app/password_reset_done.html
deleted file mode 100644
index 7b4f09a..0000000
--- a/workshop_app/templates/workshop_app/password_reset_done.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}
- Password reset successful
-{% endblock %}
-
-{% block pagetitle %}
- Instruction for setting new password has been mailed to your registered email address
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/password_reset_form.html b/workshop_app/templates/workshop_app/password_reset_form.html
deleted file mode 100644
index 8a7c09d..0000000
--- a/workshop_app/templates/workshop_app/password_reset_form.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "base.html" %}
-
-{% block pagetitle %}
- Email will be send to the registered email address
-{% endblock %}
-
-{% block content %}
-<form action="" method="post">
- {% csrf_token %}
- {{ form }}
- <button class="btn" type="submit">Request</button>
- <a class="btn" href="{{URL_ROOT}}/login/">Cancel</a>
-</form>
-{% endblock content %}
diff --git a/workshop_app/templates/workshop_app/profile_updated.html b/workshop_app/templates/workshop_app/profile_updated.html
deleted file mode 100644
index 31747b8..0000000
--- a/workshop_app/templates/workshop_app/profile_updated.html
+++ /dev/null
@@ -1,19 +0,0 @@
-{% extends "workshop_app/base.html" %}
-
-{% block title %}
- Profile Changing
-{% endblock %}
-
-
- {% block extra %}
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
- {% endblock %}
-{% block content %}
- <div class="container">
- <div class="jumbotron">
- <h3>Your Profile has changed {{ user.first_name }}</h3>
- </div>
- </div>
-{% endblock %}
-
diff --git a/workshop_app/templates/workshop_app/propose_workshop.html b/workshop_app/templates/workshop_app/propose_workshop.html
index 8f1550f..678d11e 100644
--- a/workshop_app/templates/workshop_app/propose_workshop.html
+++ b/workshop_app/templates/workshop_app/propose_workshop.html
@@ -1,63 +1,81 @@
{% extends "workshop_app/base.html" %}
{% block title %}
- Propose a workshop
+ Propose a workshop
{% endblock %}
- {% block extra %}
+{% block extra-dependencies %}
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
-
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
- <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
-
- <!-- calender -->
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+{% endblock %}
+{% block extra-custom-scripts %}
<script>
- var dateToday = new Date();
- var upto = new Date();
-
- dateToday.setDate(dateToday.getDate() + 3);
- upto.setFullYear(dateToday.getFullYear() + 1);
+ var dateToday = new Date();
+ var upto = new Date();
- $(function() {
- $( ".datepicker" ).datepicker({
- changeMonth: true,
- changeYear: true,
- minDate: dateToday,
- maxDate: upto,
- beforeShowDay: $.datepicker.noWeekends,
+ dateToday.setDate(dateToday.getDate() + 3);
+ upto.setFullYear(dateToday.getFullYear() + 1);
- // You can put more options here.
+ $(function () {
+ $(".datepicker").datepicker({
+ changeMonth: true,
+ changeYear: true,
+ minDate: dateToday,
+ maxDate: upto,
+ beforeShowDay: $.datepicker.noWeekends,
+ });
});
- });
- </script>
- {% endblock %}
+ </script>
+{% endblock %}
{% block content %}
- <style type="text/css">
- .errorlist {
- color: red;
- }
- </style>
-
- <div class="container">
- <div class="alert alert-info">
- Please Note: Students have to take a mandatory test before Advanced Python
- Workshop only those who will clear this test will be eligible to attend
- the workshop.
- </div>
- <form method="post">
- {% csrf_token %}
- <br/>
- {{ form.as_p }}
- <br><br>
- <button class="btn btn-success" type="submit">Submit</button>
- </form>
- <br>
-
- </div>
-{% endblock %}
+ <style type="text/css">
+ .errorlist {
+ color: red;
+ }
+ </style>
+
+ <div class="container" align="center">
+ <div class="alert alert-info">
+ Please Note: Students have to take a mandatory test before Advanced Python
+ Workshop only those who will clear this test will be eligible to attend
+ the workshop.
+ </div>
+ <br><br>
+ <div class="col-md-6 col-md-offset-6">
+ <div class="card border-primary">
+ <div class="card-header">
+ <h3>Propose Workshop</h3>
+ </div>
+ <div class="card-body">
+ <div class="form-group">
+ <form method="post">
+ {% csrf_token %}
+ <br/>
+ {{ form.workshop_type }}
+ <br>
+ {{ form.date }}
+ <br>
+ {{ form.tnc_accepted }} I accept the <a href="/tnc">terms and conditions</a>
+ <br>
+ {% if form.errors %}
+ <br>
+ <div style="text-align: left; border: 1px solid red; padding-top: 5px">
+ <h5 style="text-align: center; color: red; font-weight: bolder">Errors</h5>
+ {{ form.errors }}
+ </div>
+ {% endif %}
+ <br>
+ <button class="btn btn-success" type="submit">Submit</button>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+ <br>
+
+ </div>
+{% endblock %} \ No newline at end of file
diff --git a/workshop_app/templates/workshop_app/registeration_error.html b/workshop_app/templates/workshop_app/registeration_error.html
deleted file mode 100644
index ad1e73b..0000000
--- a/workshop_app/templates/workshop_app/registeration_error.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-{% block title %}
- Registeration Error
-{% endblock %}
-
-{% block content %}
- <div class="container" >
- <br>
- <h1>Error Occurred While registration</h1>
- <h3>Please try to <a href="{{ URL_ROOT }}/register/"> register again</a> using different username or email and see to it that you fill all the fields.</h3>
- </div>
-{% endblock %} \ No newline at end of file
diff --git a/workshop_app/templates/workshop_app/registration/register.html b/workshop_app/templates/workshop_app/registration/register.html
index 2d154f6..cd716f4 100644
--- a/workshop_app/templates/workshop_app/registration/register.html
+++ b/workshop_app/templates/workshop_app/registration/register.html
@@ -30,9 +30,6 @@
<button class="btn btn-primary" type="submit">Register</button>
</form><br>
<!-- Activate when Instructor registeration starts -->
- <!-- <div class="alert alert-info">
- <strong>Info!</strong> Instructors, please wait for our admin approval, if your instructor account is not activated in 7 days, please mail us at workshops[at]fossee[dot]in
- </div> -->
<br>
</div>
{% endblock %}
diff --git a/workshop_app/templates/workshop_app/self_workshop.html b/workshop_app/templates/workshop_app/self_workshop.html
deleted file mode 100644
index 2c5ad09..0000000
--- a/workshop_app/templates/workshop_app/self_workshop.html
+++ /dev/null
@@ -1,101 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-{% block title %}
- Self Workshop
-{% endblock %}
-
-{% block extra %}
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/faq.css" type="text/css" />
- <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> -->
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <link href='//fonts.googleapis.com/css?family=Antic Slab' rel='stylesheet'>
-<style>
-a {
- color: red;
-}
-</style>
-
-{% endblock %}
-
-
-{% block content %}
-
- <div class="container">
- <h1 style="color:#2952a2;">Welcome to Python Self Learning Course</h1><br>
- <ul class='num'>
- <h2>About this Course:</h2>
- <ul>
- <li class='ans'>
- It is a free online course offered by the <a href="https://fossee.in" target="_blank">FOSSEE</a> team at IIT Bombay.
- </li>
-
- <li class='ans'>
- Students can gain hands-on experience in Python through a series of practice sessions and quizzes.
- </li>
-
- <li class='ans'>
- It is open to all, interested in learning Python irrespective of their academic background.
- </li>
-
- <li class='ans'>
- The course is designed and curated by <a
- href="https://www.aero.iitb.ac.in/~prabhu/index.html"
- target="_blank">Prof.Prabhu Ramachandran,(Dept. Of Aerospace Engineering, IIT Bombay).</a>
- </li>
-
- <li class='ans'>
- Graded e-certificates are issued to participants on successful completion of the course.
- </li>
-
- <li class='ans'>
- Queries/ doubts posted by participants on the <a href="http://forums.fossee.in/filter/Python/" target="_blank">FORUMS</a> are answered by FOSSEE’s Python experts.
- </li>
-
- <li class='ans'>
- Certificates are issued within 10days after the course has ended.
- </li>
-
- </ul>
- </ul>
-
- <ul class='num'>
- <h2>Course Instructions:</h2>
- <ul>
- <li class='ans'>
- Register on <a href="http://yaksh.fossee.in" target="_blank">Yaksh</a> and search for the course <strong> Basic Programming using Python('duration') by FOSSEE IIT Bombay using the course code <h4>"python"</h4> </strong>
- </li>
-
- <li class='ans'>
- Access the “Enrolled Courses” tab to start the course
- </li>
-
- <li class='ans'>
- Complete all the lessons, exercises and quizzes in a module and then proceed to the next module.
- </li>
-
- <li class='ans'>
- If needed, revisit lessons for better understanding
- </li>
-
- </ul>
- </ul>
-
- <ul class='num'>
- <h2>Duration:</h2>
- <ul>
- <li class='ans'>
- The course will be open for about one and half month (Approximately the participant can devote an hour each day or 3 hours per day on weekends to complete the course)
- </li>
-
- <li class='ans'>
- The course will start on the 1st day of every month and closes in the mid of next month(Eg: starts at 1st Feb closes at 15th March)
- </li>
-
- </ul>
- </ul>
-
-</div>
-<br>
-<br>
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/view_comment_profile.html b/workshop_app/templates/workshop_app/view_comment_profile.html
deleted file mode 100644
index 25596c7..0000000
--- a/workshop_app/templates/workshop_app/view_comment_profile.html
+++ /dev/null
@@ -1,135 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-{% block title %}
- Coordinator Profile
-{% endblock %}
-
-
- {% block extra %}
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
- {% endblock %}
-
-{% csrf_token %}
-{% block content %}
-
- <div class="container" style="overflow-y: scroll;">
- <table class="table table-bordered">
- <tr>
- <th><label for="id_first_name"><h5>First name:</h5></label></th>
- <th><label for="id_first_name"><h5>{{ coordinator_profile.user.first_name }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_last_name"><h5>Last name:</h5></label></th>
- <th><label for="id_last_name"><h5>{{ coordinator_profile.user.last_name }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_email"><h5>Email:</h5></label></th>
- <th><label for="id_email"><h5>{{ coordinator_profile.user.email }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_institute"><h5>Institute:</h5></label></th>
- <th><label for="id_institute"><h5>{{ coordinator_profile.user.profile.institute }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_phone_number"><h5>Phone Number:</h5></label></th>
- <th><label for="id_phone_number"><h5>{{ coordinator_profile.user.profile.phone_number }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_department"><h5>Department:</h5></label></th>
- <th><label for="id_department"><h5>{{ coordinator_profile.user.profile.department }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_location"><h5>Location:</h5></label></th>
- <th><label for="id_location"><h5>{{ coordinator_profile.user.profile.location }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_position"><h5>Position:</h5></label></th>
- <th><label for="id_position"><h5>{{ coordinator_profile.user.profile.position }}</h5></label></th>
- </tr>
- </table>
- <br>
- <div class="container">
- <h2>Workshop Details</h2>
- <table class="table table-bordered">
- <tr>
- <th><label for="id_instructor_name"><h5>Instructor name</h5></label></th>
- <th><label for="id_workshop_date"><h5>Workshop date</h5></label></th>
- <th><label for="id_workshop_type"><h5>Workshop type</h5></label></th>
- </tr>
- {% for workshop in Workshops%}
- {% if workshop.proposed_workshop_date %}
- <tr>
- <td><label for="id_instructor_name"><h5>{{ workshop.proposed_workshop_instructor }}</h5></label></td>
- <td><label for="id_workshop_date"><h5>{{ workshop.proposed_workshop_date }}</h5></label></td>
- <td><label for="id_workshop_type"><h5>{{ workshop.proposed_workshop_title }}</h5></label></td>
- </tr>
- {% else %}
- <tr>
- <td><label for="id_instructor_name"><h5>{{ workshop.requested_workshop_instructor }}</h5></label></td>
- <td><label for="id_workshop_date"><h5>{{ workshop.requested_workshop_date }}</h5></label></td>
- <td><label for="id_workshop_type"><h5>{{ workshop.requested_workshop_title }}</h5></label></td>
- </tr>
- {% endif %}
- {% endfor %}
- </table>
- </div>
- <br>
- <h1 style="color:#2c5aa0">Comments</h1>
- <div>
- <form method="POST">
- <br>
- {% csrf_token %}
- {{ comment_form.as_p }}
- <button type="submit" class="btn btn-default">Post</button>
- </form>
-
- </div>
- <hr style="background-color: #fff;
- border-top: 5px double #8c8b8b;">
- <table>
- {% for comment in comments %}
- <tbody>
- <tr>
- <td>
- <h5>{{ comment.instructor_profile.profile.user.get_full_name }} | {{ comment.created_date | date }}</h5>
- <h6 style="background-color: #ecf0f1; padding:10px;">{{ comment.comment }}</h6>
- <hr style="border-top: 0.5px solid #8c8b8b;">
- </td>
- </tr>
- </tbody>
- {% endfor %}
- </table>
-
-<br><br>
- </div>
-
- <!-- Page Navigation -->
- <div class="container">
- <div class="Page-Nav" align="center">
- <nav aria-label="Page navigation">
- <ul class="pagination pagination-sm">
- <li class="page-item">
- {% if comments.has_previous %}
- <a class="page-link" tabindex="-1"
- href="?page={{ comments.previous_page_number }}">Previous</a>
- {% endif %}
- </li>
- <li class="page-item">
- <span class="current">
- Page {{ comments.number }} of {{ comments.paginator.num_pages }}
- </span>
- </li>
- <li class="page-item">
- {% if comments.has_next %}
- <a class="page-link" href="?page={{ comments.next_page_number }}">Next
- </a>
- {% endif %}
- </li>
- </ul>
- </nav>
- </div>
- <br>
- </div>
-
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/view_faq.html b/workshop_app/templates/workshop_app/view_faq.html
deleted file mode 100644
index 1822dc3..0000000
--- a/workshop_app/templates/workshop_app/view_faq.html
+++ /dev/null
@@ -1,137 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-{% block title %}
- FAQ'S
-{% endblock %}
-
-{% block extra %}
- <link rel="stylesheet" href="{{ URL_ROOT }}/static/workshop_app/css/faq.css" type="text/css" />
- <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> -->
-
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <link href='//fonts.googleapis.com/css?family=Antic Slab' rel='stylesheet'>
-
-{% endblock %}
-
-
-{% block content %}
-
- <div class="container">
- <h1 style="color: #2962B9;"> FAQs-</h1><br>
- <ul class='num'>
- <h4>Who can participate in these workshops?</h4>
- <li class='ans'>
- Anyone interested in learning Python irrespective of their domain can participate.
- </li>
- </ul>
-
- <ul class='num'>
- <h4>Will the participants receive certificates?</h4>
- <li class='ans'>
- Yes, graded certificates shall be issued only after successfully clearing our post-workshop assessments/tests.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Will the coordinators receive certificates?</h4>
- <li class='ans'>
- Yes, even the coordinators of the workshops are awarded certificates.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> When will I get my certificate?</h4>
- <li class='ans'>
- Within 15 working days from the last day of the workshop.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> How many coordinators are required to conduct a workshop?</h4>
- <li class='ans'>
- One coordinator for 50 participants.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Do we have to pay for the workshop?</h4>
- <li class='ans'>
- No, the workshop is free of charge
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Do I have to register?</h4>
- <li class='ans'>
- Yes, only the coordinator of the workshop will have to register.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Can we conduct this workshop as per our convenience?</h4>
- <li class='ans'>
- Absolutely! You may conduct the workshop as per your lab availability.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> What is the approximate wait time after requesting for a workshop?</h4>
- <li class='ans'>
- It could be between 1-2 weeks (subject to availability of our instructors).
- </li>
- </ul>
-
- <ul class='num'>
- <h4> How will the workshop be conducted?</h4>
- <li class='ans'>
- It will be a hands-on workshop with remote assistance by a FOSSEE instructor from IIT Bombay.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Can we have the instructor at our institute for the workshop?</h4>
- <li class='ans'>
- Unfortunately, we will not be able to send our instructor(s) to your institute.
- </li>
- </ul>
-
- <ul class='num'>
- <h4>I am from a non-technical background but wish to learn Python. Can I participate in this workshop?</h4>
- <li class='ans'>
- Yes, of course. This is open to anyone from any field who is interested in learning Python.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Can I use the material of this workshop in my class?</h4>
- <li class='ans'>
- Sure, you can use our video lectures.
- </li>
- </ul>
-
- <ul class='num'>
- <h4> Are these workshops provided to individuals as well?</h4>
- <li class='ans'>
- Currently, this program is exclusively available for institutes only. However, if you are not associated with an institute and are willing to participate in this workshop, please write to us at workshops[at]fossee[dot]in
- </li>
- </ul>
-
- <ul class='num'>
- <h4> What are the equipments required for conducting this workshop?</h4>
- <li class='ans'>
- A room with projector, speaker, microphone, laptops/desktops for every participant, high-speed internet and one laptop/desktop with a webcam.
- </li>
- </ul>
-
- <ul class='num'>
- <h4>What are the video-audio conferencing tools used for this workshop?</h4>
- <li class='ans'>
- We will use any of these tools: Skype, appear.in and hangouts
- </li>
- </ul>
- </div>
-<br>
-<br>
-
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/view_profile.html b/workshop_app/templates/workshop_app/view_profile.html
index 6be4b7e..9330cb0 100644
--- a/workshop_app/templates/workshop_app/view_profile.html
+++ b/workshop_app/templates/workshop_app/view_profile.html
@@ -1,62 +1,84 @@
{% extends 'workshop_app/base.html' %}
{% block title %}
- View Profile
+ Coordinator Profile
{% endblock %}
- {% block extra %}
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="{{URL_ROOT}}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
- {% endblock %}
+{% block extra %}
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
+ <script src="{{ URL_ROOT }}/static/workshop_app/js/bootstrap-3.3.7.min.js"></script>
+{% endblock %}
{% csrf_token %}
{% block content %}
- <div class="container">
- <table class="table table-bordered">
- <tr>
- <th><label for="id_first_name"><h5>First name:</h5></label></th>
- <th><label for="id_first_name"><h5>{{ user.first_name }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_last_name"><h5>Last name:</h5></label></th>
- <th><label for="id_last_name"><h5>{{ user.last_name }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_email"><h5>Email:</h5></label></th>
- <th><label for="id_email"><h5>{{ user.email }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_institute"><h5>Institute:</h5></label></th>
- <th><label for="id_institute"><h5>{{ user.profile.institute }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_phone_number"><h5>Phone Number:</h5></label></th>
- <th><label for="id_phone_number"><h5>{{ user.profile.phone_number }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_department"><h5>Department:</h5></label></th>
- <th><label for="id_department"><h5>{{ user.profile.department }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_location"><h5>Location:</h5></label></th>
- <th><label for="id_location"><h5>{{ user.profile.location }}</h5></label></th>
- </tr>
- <tr>
- <th><label for="id_position"><h5>Position:</h5></label></th>
- <th><label for="id_position"><h5>{{ user.profile.position }}</h5></label></th>
- </tr>
- </table>
- <br>
- <a class="btn btn-primary" href="{{ URL_ROOT }}/edit_profile/">Edit Profile</a>
- {% if user.profile.position == 'instructor' %}
- <a class="btn btn-primary " href="{{ URL_ROOT }}/download/">Download Workshop</a>
- {% endif %}
-
-
- </div>
-
-
-
+ <div class="container">
+ <table class="table table-bordered">
+ <tr>
+ <th><label for="id_first_name"><h5>First name:</h5></label></th>
+ <th><label for="id_first_name"><h5>{{ coordinator_profile.user.first_name }}</h5></label></th>
+ </tr>
+ <tr>
+ <th><label for="id_last_name"><h5>Last name:</h5></label></th>
+ <th><label for="id_last_name"><h5>{{ coordinator_profile.user.last_name }}</h5></label></th>
+ </tr>
+ <tr>
+ <th><label for="id_email"><h5>Email:</h5></label></th>
+ <th><label for="id_email"><h5>{{ coordinator_profile.user.email }}</h5></label></th>
+ </tr>
+ <tr>
+ <th><label for="id_institute"><h5>Institute:</h5></label></th>
+ <th><label for="id_institute"><h5>{{ coordinator_profile.user.profile.institute }}</h5></label></th>
+ </tr>
+ <tr>
+ <th><label for="id_phone_number"><h5>Phone Number:</h5></label></th>
+ <th><label for="id_phone_number"><h5>{{ coordinator_profile.user.profile.phone_number }}</h5></label>
+ </th>
+ </tr>
+ <tr>
+ <th><label for="id_department"><h5>Department:</h5></label></th>
+ <th><label for="id_department"><h5>{{ coordinator_profile.user.profile.department }}</h5></label></th>
+ </tr>
+ <tr>
+ <th><label for="id_location"><h5>Location:</h5></label></th>
+ <th><label for="id_location"><h5>{{ coordinator_profile.user.profile.location }}</h5></label></th>
+ </tr>
+ <tr>
+ <th><label for="id_position"><h5>Position:</h5></label></th>
+ <th><label for="id_position"><h5>{{ coordinator_profile.user.profile.position }}</h5></label></th>
+ </tr>
+ </table>
+ <br>
+ <div class="container">
+ <h2>Workshop Details</h2>
+ <table class="table table-bordered">
+ <tr>
+ <th><label for="id_instructor_name">Instructor name</label></th>
+ <th><label for="id_workshop_date">Workshop date</label></th>
+ <th><label for="id_workshop_type">Workshop type</label></th>
+ </tr>
+ {% for workshop in Workshops %}
+ {% if workshop.instructor %}
+ <tr>
+ <td><label for="id_instructor_name">{{ workshop.instructor }}
+ </label></td>
+ <td><label for="id_workshop_date">{{ workshop.date }}</label>
+ </td>
+ <td><label for="id_workshop_type">{{ workshop.workshop_type }}</label>
+ </td>
+ </tr>
+ {% else %}
+ <tr>
+ <td><span class="badge badge-warning">Pending</span></td>
+ <td><label for="id_workshop_date">{{ workshop.date }}</label>
+ </td>
+ <td><label for="id_workshop_type">{{ workshop.workshop_type }}</label>
+ </td>
+ </tr>
+ {% endif %}
+ {% endfor %}
+ </table>
+ </div>
+ </div>
{% endblock %}
diff --git a/workshop_app/templates/workshop_app/workshop_stats.html b/workshop_app/templates/workshop_app/workshop_stats.html
deleted file mode 100644
index 15c4a55..0000000
--- a/workshop_app/templates/workshop_app/workshop_stats.html
+++ /dev/null
@@ -1,345 +0,0 @@
-{% extends 'workshop_app/base.html' %}
-
-
-{% block extra %}
- <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
- <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
-
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
- <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
- <!-- For Charts -->
-
- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.bundle.min.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
-
- <!-- For Google GeoChart India Map -->
- <script type='text/javascript' src='https://www.google.com/jsapi'></script>
-
-<script>
- var dateToday = new Date();
- var upto = new Date();
-
- dateToday.setDate(dateToday.getDate() - 1);
- upto.setFullYear(dateToday.getFullYear() + 1);
-
- $( function() {
- from = $( "#from" )
- .datepicker({
- defaultDate: "+1w",
- changeMonth: true,
- changeYear: true,
- showButtonPanel: true,
- maxDate: dateToday,
- dateFormat: "yy-mm-dd"
- })
- .on( "change", function() {
- to.datepicker( "option", "minDate", getDate( this ) );
- }),
- to = $( "#to" ).datepicker({
- defaultDate: "+1w",
- changeMonth: true,
- changeYear: true,
- showButtonPanel: true,
- minDate: dateToday,
- maxDate: upto,
- dateFormat: "yy-mm-dd"
- })
- .on( "change", function() {
- from.datepicker( "option", "maxDate", getDate( this ) );
- });
-
- function getDate( element ) {
- var date;
- try {
- date = $.datepicker.parseDate( dateFormat, element.value );
- } catch( error ) {
- date = null;
- }
- return date;
- }
- } );
-
- </script>
-
-{% endblock %}
-
-{% block content %}
-
-<div class="container">
- <div class="row">
- <div class="col-md-6" align="left" >
- <fieldset data-mini="true">
- <label for="radio-1">Monthly Count </label>
- <input type="radio" name="radio-1" id="radio-1" value="NWPM">
- <label for="radio-2">Overall Count</label>
- <input type="radio" name="radio-1" id="radio-2" value="OWC">
- <label for="radio-3">India Map</label>
- <input type="radio" name="radio-1" id="radio-3" value="MOIN">
- </fieldset>
- </div>
-
-
- {% if show_workshop_stats %}
- <div align="right" class="col-md-6">
- <form method="POST" >
- {% csrf_token %}
- <div class="form-group">
- <label for="from">From</label>
- <input type="text" id="from" name="from">
- <label for="to">to</label>
- <input type="text" id="to" name="to">
- <button class="btn btn-warning btn-sm" type="submit" name="Download" value="Download">Download</button>
- <button class="btn btn-info btn-sm" type="submit" name="View" value="View">View</button>
- </div>
- </form>
-
- {% if messages %}
- <ul class="messages">
- {% for message in messages %}
- <div class="alert alert-{{ message.tags }}">
- <li {% if message.tags %} class="{{ message.tags }}"{% endif %}> {{ message }}
- </li>
- </div>
- {% endfor %}
- </ul>
- {% endif %}
-
- </div>
- <br>
- <table class="table table-hover">
- <thead>
- <tr>
- <th>Coordinator Name</th>
- <th>Institute Name</th>
- <th>Instructor Name</th>
- <th>Workshop Name</th>
- <th>Workshop Date</th>
- <th>Requested/Proposed By</th>
- </tr>
- </thead>
- {% csrf_token %}
- {% for workshop in upcoming_workshops %}
- {% if workshop.proposed_workshop_date %}
- <tbody>
- <tr>
- <td>{{ workshop.proposed_workshop_coordinator.get_full_name | capfirst }}</td>
- <td>{{ workshop.proposed_workshop_coordinator.profile.institute | capfirst }}</td>
- <td>{{ workshop.proposed_workshop_instructor.get_full_name }}</td>
- <td>{{ workshop.proposed_workshop_title.workshoptype_name }}</td>
- <td>{{ workshop.proposed_workshop_date | date}}</td>
- <td>Coordinator</td>
- </tr>
- </tbody>
- {% else %}
- <tbody>
- <tr>
- <td>{{ workshop.requested_workshop_coordinator.get_full_name | capfirst }}</td>
- <td>{{ workshop.requested_workshop_coordinator.profile.institute | capfirst }}</td>
- <td>{{ workshop.requested_workshop_instructor.get_full_name }}</td>
- <td>{{ workshop.requested_workshop_title.workshoptype_name }}</td>
- <td>{{ workshop.requested_workshop_date | date}}</td>
- <td>Instructor</td>
- </tr>
- </tbody>
- {% endif %}
- {% endfor %}
- </table>
-
- <!-- Page Navigation -->
- <div class="container">
- <div class="Page-Nav" align="center">
- <nav aria-label="Page navigation">
- <ul class="pagination pagination-sm">
- <li class="page-item">
- {% if upcoming_workshops.has_previous %}
- <a class="page-link" tabindex="-1"
- href="?page={{ upcoming_workshops.previous_page_number }}">Previous</a>
- {% endif %}
- </li>
- <li class="page-item">
- <span class="current">
- Page {{ upcoming_workshops.number }} of {{ upcoming_workshops.paginator.num_pages }}
- </span>
- </li>
- <li class="page-item">
- {% if upcoming_workshops.has_next %}
- <a class="page-link" href="?page={{ upcoming_workshops.next_page_number }}">Next
- </a>
- {% endif %}
- </li>
- </ul>
- </nav>
- </div>
- </div>
- {% else %}
- <div class="jumbotron">
- <h2>Permission to View Upcoming Workshops is set to false, please set it to true in settings.py</h2>
- </div>
- {% endif %}
- </div>
-
-
-<div class="row">
- <br>
- <div class="col-md-12 ">
- <br>
- <canvas id="myChartPie" width="60px" height="21px"></canvas>
- <script>
- $( function() {
- $( "fieldset" ).controlgroup();
- });
-
- var ctx1 = document.getElementById("myChartPie").getContext('2d');
- var myChart;
-
- $('input[type=radio]').change(function() {
-
- if (this.value == 'NWPM') {//Number of Workshops per month
- if(myChart){
- myChart.destroy();
- }
-
- document.getElementById("visualization").style.visibility='hidden';
- myChart = new Chart(ctx1, {
- type: 'bar',
- data: {
- labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
- datasets: [{
- label: 'Number of workshops per Month for '+ dateToday.getFullYear(),
- data: {{ workshop_count }},
- backgroundColor: [
- 'rgba(255, 99, 132, 0.2)',
- 'rgba(54, 162, 235, 0.2)',
- 'rgba(255, 206, 86, 0.2)',
- 'rgba(75, 192, 192, 0.2)',
- 'rgba(153, 102, 255, 0.2)',
- 'rgba(242, 38, 19, 0.2)',
- 'rgba(25, 91, 13, 0.2)',
- 'rgba(54, 12, 235, 0.2)',
- 'rgba(150, 40, 27, 0.2)',
- 'rgba(66, 114, 155, 0.2)',
- 'rgba(219, 10, 91, 0.2)',
- 'rgba(191, 191, 191, 0.2)'
- ],
- borderColor: [
- 'rgba(255, 99, 132, 1)',
- 'rgba(54, 162, 235, 1)',
- 'rgba(255, 206, 86, 1)',
- 'rgba(75, 192, 192, 1)',
- 'rgba(153, 102, 255, 1)',
- 'rgba(242, 38, 19, 1)',
- 'rgba(25, 91, 13, 1)',
- 'rgba(54, 12, 235, 1)',
- 'rgba(150, 40, 27 ,1)',
- 'rgba(66, 114, 155, 1)',
- 'rgba(219, 10, 91, 1)',
- 'rgba(191, 191, 191, 1)'
- ],
- borderWidth: 1
- }]
- },
- options: {
- responsive: true,
- scales: {
- yAxes: [{
- ticks: {
- beginAtZero:true
- }
- }]
- }
- }
- });
- }
- else if (this.value == 'OWC') { //Overall Workshop Count
- if(myChart){
- myChart.destroy();
- }
-
- document.getElementById("visualization").style.visibility='hidden';
- myChart = new Chart(ctx1, {
- type: 'pie',
- data: {
- labels : {{ workshoptype_count.0 | safe}},
- datasets: [{
- data: {{ workshoptype_count.1 }},
- //Add more color scheme if workshop number increases
- backgroundColor: [
- 'rgba(153, 102, 255, 1)',
- 'rgba(191, 191, 1, 1)',
- 'rgba(75, 192, 192, 1)',
- 'rgba(153, 102, 255, 1)'
- ]
- }]
- },
- options: {
- responsive: true
- }
- });
- }
-
- else if (this.value == 'MOIN') {
- if(myChart){
- myChart.destroy();
- }
-
- var dWidth = $(window).width() * 0.9;
- var dHeight = $(window).height() * 0.9;
-
- $( "#visualization" ).dialog({
- resizable: false,
- draggable: true,
- title: 'State wise Completed Workshops(Map of India)',
- closeOnEscape: true,
- stack: true,
- zIndex: 10000,
- width: dWidth,
- height: dHeight,
- modal: true
- });
-
- document.getElementById("visualization").style.visibility='visible';
- function drawVisualization() {
- var data = google.visualization.arrayToDataTable(
- {{ india_map | safe }}
- );
-
- var opts = {
- region: 'IN',
- domain: 'IN',
- displayMode: 'regions',
- resolution: 'provinces',
- colorAxis: {colors: ['lightyellow', 'orange']},
- legend: {position: 'top'},
- };
-
- var geochart = new google.visualization.GeoChart(
- document.getElementById('visualization'));
- geochart.draw(data, opts);
- };
- if(google) {
- google.load('visualization', '1.0', {
- packages: ['geochart'],
- callback: function() {
- // do stuff, if you wan't - it doesn't matter, because the page isn't blank!
- drawVisualization();
- }
- })
- }
- }
- });
- </script>
- <style>
- #visualization path {
- stroke-width:1; /* control the countries borders width */
- stroke:#6699cc; /* choose a color for the border */
- }
- </style>
- <div id="visualization" style="width: 400px; height: 300px; display: block; margin: 0 auto;" ></div>
-
- </div>
-</div>
-</div>
-<br>
-{% endblock %}
diff --git a/workshop_app/templates/workshop_app/view_workshoptype_details.html b/workshop_app/templates/workshop_app/workshop_type_details.html
index 1504430..b8d6559 100644
--- a/workshop_app/templates/workshop_app/view_workshoptype_details.html
+++ b/workshop_app/templates/workshop_app/workshop_type_details.html
@@ -16,7 +16,7 @@
{% block content %}
<div class="container">
- {{ workshoptype.workshoptype_description | safe }}
+ {{ workshop_type.description | safe }}
</div>
{% endblock %}
diff --git a/workshop_app/templates/workshop_app/view_workshoptype_list.html b/workshop_app/templates/workshop_app/workshop_type_list.html
index 2a561e7..0531864 100644
--- a/workshop_app/templates/workshop_app/view_workshoptype_list.html
+++ b/workshop_app/templates/workshop_app/workshop_type_list.html
@@ -63,13 +63,13 @@
</tr>
</thead>
- {% for w in workshoptype %}
+ {% for w in workshop_type %}
<tbody>
<tr >
<td scope="row" id="{{ forloop.counter }}">{{ forloop.counter }}</td>
- <td>{{ w.workshoptype_name }}</td>
- <td>{{ w.workshoptype_duration }}</td>
- <td><a href="{{URL_ROOT}}/view_workshoptype_details/{{ w.id }}" class="btn btn-default btn-sm" class="accordion-toggle" >View Workshop Details</a></td>
+ <td>{{ w.name }}</td>
+ <td>{{ w.duration }}</td>
+ <td><a href="{{URL_ROOT}}/workshop_type_details/{{ w.id }}" class="btn btn-default btn-sm" class="accordion-toggle" >View Workshop Details</a></td>
</tr>
</tbody>
{% endfor %}
@@ -101,17 +101,17 @@
<li class="page-item">
{% if workshoptype.has_previous %}
<a class="page-link" tabindex="-1"
- href="?page={{ workshoptype.previous_page_number }}">Previous</a>
+ href="?page={{ workshop_type.previous_page_number }}">Previous</a>
{% endif %}
</li>
<li class="page-item">
<span class="current">
- Page {{ workshoptype.number }} of {{ workshoptype.paginator.num_pages }}
+ Page {{ workshop_type.number }} of {{ workshop_type.paginator.num_pages }}
</span>
</li>
<li class="page-item">
- {% if workshoptype.has_next %}
- <a class="page-link" href="?page={{ workshoptype.next_page_number }}">Next
+ {% if workshop_type.has_next %}
+ <a class="page-link" href="?page={{ workshop_type.next_page_number }}">Next
</a>
{% endif %}
</li>
diff --git a/workshop_app/urls.py b/workshop_app/urls.py
index 704ae58..4bb140c 100644
--- a/workshop_app/urls.py
+++ b/workshop_app/urls.py
@@ -15,7 +15,6 @@ Including another URLconf
"""
from django.conf.urls import url
from workshop_app import views
-import django
js_info_dict = {
'packages': ('recurrence', ),
@@ -30,21 +29,9 @@ urlpatterns = [
url(r'^logout/$', views.user_logout),
url(r'^view_profile/$', views.view_profile),
url(r'^edit_profile/$', views.edit_profile),
- url(r'^book/$', views.book),
- url(r'^book_workshop/$', views.book_workshop),
url(r'^my_workshops/$', views.my_workshops),
- url(r'^how_to_participate/$', views.how_to_participate),
- url(r'^faq/$', views.faq),
- url(r'^manage/$', views.manage),
- url(r'^view_workshoptype_list/$', views.view_workshoptype_list),
- url(r'^view_workshoptype_details/([1-9][0-9]*)$', \
- views.view_workshoptype_details),
- url(r'^create_workshop/$', views.create_workshop),
url(r'^propose_workshop/$', views.propose_workshop),
- url(r'^workshop_stats/$', views.workshop_stats),
- url(r'^jsi18n/$', django.views.i18n.javascript_catalog, js_info_dict),
- url(r'^self_workshop', views.self_workshop),
- url(r'^view_comment_profile/([1-9][0-9]*)$', views.view_comment_profile),
- url(r'^download/',views.download_csv_data),
+ url(r'^workshop_types/$', views.workshop_type_list),
+ url(r'^workshop_type_details/([1-9][0-9]*)$', views.workshop_type_details),
+ url(r'^view_profile/([1-9][0-9]*)$', views.view_comment_profile),
]
-
diff --git a/workshop_app/views.py b/workshop_app/views.py
index 3ebae9f..5d0525c 100644
--- a/workshop_app/views.py
+++ b/workshop_app/views.py
@@ -1,112 +1,83 @@
-from textwrap import dedent
-from os import listdir, path, sep
-from zipfile import ZipFile
-import datetime as dt
-import csv
-import logging
try:
from StringIO import StringIO as string_io
except ImportError:
from io import BytesIO as string_io
-from datetime import datetime, date
-from itertools import chain
+from datetime import datetime
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.decorators import login_required
-from django.contrib import messages
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render, redirect
from django.utils import timezone
-from django.http import HttpResponse, HttpResponseRedirect
-from django.conf import settings
-from django.contrib import messages
from .forms import (
- UserRegistrationForm, UserLoginForm,
- ProfileForm, CreateWorkshop,
- ProposeWorkshopDateForm, ProfileCommentsForm
- )
+ UserRegistrationForm, UserLoginForm,
+ ProfileForm, WorkshopForm
+)
from .models import (
- Profile, User,
- has_profile, Workshop,
- WorkshopType, RequestedWorkshop,
- BookedWorkshop, ProposeWorkshopDate,
- Testimonial, ProfileComments, Banner
- )
-from teams.models import Team
+ Profile, User,
+ Workshop,
+ WorkshopType
+)
from .send_mails import send_email
__author__ = "Akshen Doke"
__credits__ = ["Mahesh Gudi", "Aditya P.", "Ankit Javalkar",
- "Prathamesh Salunke", "Kiran Kishore",
- "KhushalSingh Rajput", "Prabhu Ramachandran",
- "Arun KP"]
+ "Prathamesh Salunke", "Kiran Kishore",
+ "KhushalSingh Rajput", "Prabhu Ramachandran",
+ "Arun KP"]
+# Helper functions
+
def is_email_checked(user):
- if hasattr(user, 'profile'):
- return True if user.profile.is_email_verified else False
- else:
- return False
+ return user.profile.is_email_verified
-def is_superuser(user):
- return True if user.is_superuser else False
+def is_instructor(user):
+ """Check if the user is having instructor rights"""
+ return user.groups.filter(name='instructor').exists()
-def index(request):
- '''Landing Page'''
+def get_landing_page(user):
+ # For now, landing pages of both instructor and coordinator are same
+ if is_instructor(user):
+ return '/my_workshops/'
+ return '/my_workshops/'
- user = request.user
- form = UserLoginForm()
- testimonials = Testimonial.objects.all()
- if user.is_authenticated() and is_email_checked(user):
- if user.groups.filter(name='instructor').count() > 0:
- return redirect('/manage/')
- return redirect('/book/')
- elif request.method == "POST":
- form = UserLoginForm(request.POST)
- if form.is_valid():
- user = form.cleaned_data
- login(request, user)
- if is_superuser(user):
- return redirect("/admin")
- if user.groups.filter(name='instructor').count() > 0:
- return redirect('/manage/')
- return redirect('/book/')
- return render(request, "workshop_app/index.html",
- {
- "form": form,
- "testimonials": testimonials,
- "banners": Banner.objects.all(),
- }
- )
+# View functions
+def index(request):
+ """Landing Page : Redirect to login page if not logged in
+ Redirect to respective landing page according to position"""
+ user = request.user
+ if user.is_authenticated and is_email_checked(user):
+ return redirect(get_landing_page(user))
+
+ return redirect('/login/')
-def is_instructor(user):
- '''Check if the user is having instructor rights'''
- return True if user.groups.filter(name='instructor').count() > 0 else False
+# User views
+# TODO: Forgot password workflow
def user_login(request):
- '''User Login'''
+ """User Login"""
user = request.user
- if is_superuser(user):
+ if user.is_superuser:
return redirect('/admin')
- if user.is_authenticated():
- if user.groups.filter(name='instructor').count() > 0:
- return redirect('/manage/')
- return redirect('/book/')
+ if user.is_authenticated:
+ return redirect(get_landing_page(user))
if request.method == "POST":
form = UserLoginForm(request.POST)
if form.is_valid():
user = form.cleaned_data
- login(request, user)
- if user.groups.filter(name='instructor').count() > 0:
- return redirect('/manage/')
- return redirect('/book/')
+ if user.profile.is_email_verified:
+ login(request, user)
+ return redirect(get_landing_page(user))
+ else:
+ return render(request, 'workshop_app/activation.html')
else:
return render(request, 'workshop_app/login.html', {"form": form})
else:
@@ -115,1178 +86,297 @@ def user_login(request):
def user_logout(request):
- '''Logout'''
+ """Logout"""
logout(request)
return render(request, 'workshop_app/logout.html')
def activate_user(request, key=None):
user = request.user
- if is_superuser(user):
+ if user.is_superuser:
return redirect("/admin")
if key is None:
- if user.is_authenticated() and user.profile.is_email_verified==0 and \
- timezone.now() > user.profile.key_expiry_time:
+ if user.is_authenticated and not user.profile.is_email_verified and \
+ timezone.now() > user.profile.key_expiry_time:
status = "1"
Profile.objects.get(user_id=user.profile.user_id).delete()
User.objects.get(id=user.profile.user_id).delete()
return render(request, 'workshop_app/activation.html',
- {'status':status})
- elif user.is_authenticated() and user.profile.is_email_verified==0:
+ {'status': status})
+ elif user.is_authenticated and not user.profile.is_email_verified:
return render(request, 'workshop_app/activation.html')
- elif user.is_authenticated() and user.profile.is_email_verified:
+ elif user.is_authenticated and user.profile.is_email_verified:
status = "2"
return render(request, 'workshop_app/activation.html',
- {'status':status})
+ {'status': status})
else:
return redirect('/register/')
- try:
- user = Profile.objects.get(activation_key=key)
- except:
- return redirect('/register/')
-
- if key == user.activation_key:
- user.is_email_verified = True
- user.save()
- status = "0"
+ user = Profile.objects.filter(activation_key=key)
+ if user.exists():
+ user = user.first()
else:
logout(request)
- return redirect('/logout/')
+ return redirect('/register/')
+
+ user.is_email_verified = True
+ user.save()
+ status = "0"
return render(request, 'workshop_app/activation.html',
- {"status": status})
+ {"status": status})
def user_register(request):
- '''User Registration form'''
+ """User Registration form"""
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
- data = form.cleaned_data
username, password, key = form.save()
new_user = authenticate(username=username, password=password)
login(request, new_user)
user_position = request.user.profile.position
send_email(
- request, call_on='Registration',
- user_position=user_position,
- key=key
- )
-
+ request, call_on='Registration',
+ user_position=user_position,
+ key=key
+ )
return render(request, 'workshop_app/activation.html')
else:
- if request.user.is_authenticated():
+ if request.user.is_authenticated:
return redirect('/view_profile/')
return render(
request, "workshop_app/registration/register.html",
{"form": form}
- )
+ )
else:
- if request.user.is_authenticated() and is_email_checked(request.user):
+ if request.user.is_authenticated and is_email_checked(request.user):
return redirect('/my_workshops/')
- elif request.user.is_authenticated():
+ elif request.user.is_authenticated:
return render(request, 'workshop_app/activation.html')
form = UserRegistrationForm()
return render(request, "workshop_app/registration/register.html", {"form": form})
-# This is shown to coordinator for booking workshops
-def book(request):
+@login_required
+def view_profile(request):
+ """ view instructor and coordinator profile """
user = request.user
- if user.is_authenticated():
- if is_email_checked(user):
- if user.groups.filter(name='instructor').count() > 0:
- return redirect('/manage/')
-
- workshop_details = Workshop.objects.all()
-
- workshop_occurence_list = []
- today = datetime.now() + dt.timedelta(days=3)
- upto = datetime.now() + dt.timedelta(weeks=52)
- for workshops in workshop_details:
- dates = workshops.recurrences.between(
- today,
- upto,
- inc=True
- )
-
- for d in range(len(dates)):
- workshop_occurence = [
- dates[d].strftime("%d-%m-%Y"),
- workshops.workshop_instructor,
- workshops.workshop_title,
- workshops.workshop_instructor_id,
- workshops.workshop_title_id,
- workshops.workshop_title.workshoptype_description
- ]
-
- workshop_occurence_list.append(workshop_occurence)
- del workshop_occurence
-
- # Gives you the objects of BookedWorkshop
- bookedworkshop = BookedWorkshop.objects.all()
- if len(bookedworkshop) != 0:
- for b in bookedworkshop:
- '''
- handles objects from bookedworkshop
- -requested
- -proposed
- '''
- try:
- x = b.booked_workshop_requested.requested_workshop_date.strftime("%d-%m-%Y")
- y = b.booked_workshop_requested.requested_workshop_title
- except:
- x = b.booked_workshop_proposed.proposed_workshop_date.strftime("%d-%m-%Y")
- y = b.booked_workshop_proposed.proposed_workshop_title
- for a in workshop_occurence_list:
- if a[0] == x and a[2] == y:
- workshop_occurence_list.remove(a)
- del x, y
-
- # Objects of RequestedWorkshop for that particular coordinator
- rW_obj = RequestedWorkshop.objects.filter(
- requested_workshop_coordinator=request.user
- )
- for r in rW_obj:
- x = r.requested_workshop_date.strftime("%d-%m-%Y")
- for a in workshop_occurence_list:
- if a[0] == x:
- workshop_occurence_list.remove(a)
- del x
-
-
- # Show upto 12 Workshops per page
- paginator = Paginator(workshop_occurence_list, 12)
- page = request.GET.get('page')
- try:
- workshop_occurences = paginator.page(page)
- except PageNotAnInteger:
- # If page is not an integer, deliver first page.
- workshop_occurences = paginator.page(1)
- except EmptyPage:
- # If page is out of range(e.g 999999), deliver last page.
- workshop_occurences = paginator.page(paginator.num_pages)
-
- return render(
- request, "workshop_app/booking.html",
- {"workshop_details": workshop_occurences}
- )
- else:
- return redirect('/activate_user/')
- else:
- return redirect('/login/')
+ if user.is_superuser:
+ return redirect('/admin')
+ return render(request, "workshop_app/view_profile.html")
@login_required
-def book_workshop(request):
- '''
- Function for Updating RequestedWorkshop Model
- '''
- if request.method == 'POST':
- user_position = request.user.profile.position
- client_data = request.body.decode("utf-8").split("&")
- client_data = client_data[0].split("%2C")
- workshop_date = client_data[0][2:]
-
- if client_data[-1] == '0':
- queue = RequestedWorkshop.objects.filter(
- requested_workshop_instructor=client_data[1],
- requested_workshop_date=datetime.strptime(
- client_data[0][2:], "%d-%m-%Y"
- ),
- requested_workshop_title=client_data[-2]
- ).count() + 1
-
- return HttpResponse(str(queue))
-
- workshops_list = Workshop.objects.filter(
- workshop_instructor=client_data[1],
- workshop_title_id=client_data[2]
- )
- today = datetime.now() + dt.timedelta(days=3)
- upto = datetime.now() + dt.timedelta(weeks=52)
- for workshop in workshops_list:
- workshop_recurrence_list = workshop.recurrences.between(
- today,
- upto,
- inc=True
- )
-
- rW_obj = RequestedWorkshop()
- if RequestedWorkshop.objects.filter(
- requested_workshop_instructor=workshop.workshop_instructor,
- requested_workshop_date=datetime.strptime(
- client_data[0][2:], "%d-%m-%Y",
- ),
- requested_workshop_coordinator=request.user,
- requested_workshop_title=client_data[-1]
- ).count() > 0:
-
- return HttpResponse(dedent("""You already have a booking
- for this workshop please check the
- instructors response in My Workshops tab and
- also check your email."""))
- else:
- for w in workshop_recurrence_list:
- if workshop_date == (w.strftime("%d-%m-%Y")):
- rW_obj.requested_workshop_instructor = workshop.workshop_instructor
- rW_obj.requested_workshop_coordinator = request.user
- rW_obj.requested_workshop_date = datetime.strptime(
- workshop_date,"%d-%m-%Y"
- )
- rW_obj.requested_workshop_title = workshop.workshop_title
- rW_obj.save()
-
- queue = RequestedWorkshop.objects.filter(
- requested_workshop_instructor=workshop.workshop_instructor,
- requested_workshop_date=datetime.strptime(
- workshop_date, "%d-%m-%Y",
- ),
- requested_workshop_title=client_data[-1]
- ).count()
-
- # Mail to instructor
- send_email(request, call_on='Booking',
- user_position='instructor',
- workshop_date=workshop_date,
- workshop_title=workshop.workshop_title.workshoptype_name,
- user_name=str(request.user.get_full_name()),
- other_email=workshop.workshop_instructor.email
- )
- phone_number = workshop.workshop_instructor.profile.phone_number
- #Mail to coordinator
- send_email(request, call_on='Booking',
- workshop_date=workshop_date,
- workshop_title=workshop.workshop_title.workshoptype_name,
- user_name=workshop.workshop_instructor.profile.user.get_full_name(),
- other_email=workshop.workshop_instructor.email,
- phone_number=phone_number)
-
- return HttpResponse(dedent("""\
- Your request has been successful, Please check
- your email for further information. Your request is number
- {0} in the queue.""".format(str(queue))))
- else:
- logout(request)
- return HttpResponse("Some Error Occurred.")
-
+def edit_profile(request):
+ """ edit profile details facility for instructor and coordinator """
-@login_required
-def manage(request):
user = request.user
+ if user.is_superuser:
+ return redirect('/admin')
- if user.is_authenticated() and is_email_checked(user):
- #Move user to the group via admin
- if user.groups.filter(name='instructor').count() > 0:
- try:
- #Can Handle Multiple Workshops
- workshop_details = Workshop.objects.filter(
- workshop_instructor=user.id
- )
-
- workshop_occurence_list = []
- today = datetime.now() + dt.timedelta(days=3)
- upto = datetime.now() + dt.timedelta(weeks=52)
- for workshop in workshop_details:
- workshop_occurence = workshop.recurrences.between(
- today,
- upto,
- inc=True
- )
- for i in range(len(workshop_occurence)):
-
- workshop_occurence_list.append({
- "user": str(user),
- "workshop": workshop.workshop_title,
- "date": workshop_occurence[i].date()
- })
-
- requested_workshop = RequestedWorkshop.objects.filter(
- requested_workshop_instructor=user.id
- )
-
-
- #Need to recheck logic
- for j in range(len(requested_workshop)):
- for i in workshop_occurence_list:
- a = requested_workshop[j].requested_workshop_date
- b = requested_workshop[j].requested_workshop_title
- if i['date'] == a and i['workshop'] == b:
- workshop_occurence_list.remove(i)
- del a, b
-
-
- #Show upto 12 Workshops per page
- paginator = Paginator(workshop_occurence_list, 12)
- page = request.GET.get('page')
- try:
- workshops = paginator.page(page)
- except PageNotAnInteger:
- #If page is not an integer, deliver first page.
- workshops = paginator.page(1)
- except EmptyPage:
- #If page is out of range(e.g 999999), deliver last page.
- workshops = paginator.page(paginator.num_pages)
- except:
- workshops = None
-
- return render(
- request, "workshop_app/manage.html",
- {"workshop_occurence_list": workshops}
- )
+ if request.method == 'POST':
+ form = ProfileForm(request.POST, user=user, instance=user.profile)
+ if form.is_valid():
+ form_data = form.save(commit=False)
+ form_data.user = user
+ form_data.user.first_name = request.POST['first_name']
+ form_data.user.last_name = request.POST['last_name']
+ form_data.user.save()
+ form_data.save()
- return redirect('/book/')
+ return redirect('/view_profile/')
+ else:
+ return render(request, 'workshop_app/edit_profile.html')
else:
- return redirect('/activate_user/')
+ form = ProfileForm(user=user, instance=user.profile)
+ return render(request, 'workshop_app/edit_profile.html', {'form': form})
+# Workshop views
+
@login_required
def my_workshops(request):
user = request.user
- if user.is_authenticated() and is_email_checked(user):
+ if user.is_authenticated:
+ # View for instructor
if is_instructor(user):
if request.method == 'POST':
- user_position = request.user.profile.position
- client_data = request.body.decode("utf-8").split("&")
- client_data = client_data[0].split("%2C")
- if client_data[-1] == 'ACCEPTED':
- workshop_date = datetime.strptime(
- client_data[1], "%Y-%m-%d"
- )
-
- coordinator_obj = User.objects.get(username=client_data[0][2:])
-
- workshop_status = RequestedWorkshop.objects.get(
- requested_workshop_instructor=user.id,
- requested_workshop_date=workshop_date,
- requested_workshop_coordinator=coordinator_obj.id,
- requested_workshop_title=client_data[2]
- )
-
- workshop_status.status = client_data[-1]
- workshop_status.save()
- booked_workshop_obj = BookedWorkshop()
- booked_workshop_obj.booked_workshop_requested = workshop_status
- booked_workshop_obj.save()
- ws = workshop_status
- cmail = ws.requested_workshop_coordinator.email
- cname = ws.requested_workshop_coordinator.profile.user.get_full_name()
- cnum = ws.requested_workshop_coordinator.profile.phone_number
- cinstitute = ws.requested_workshop_coordinator.profile.institute
- inum = request.user.profile.phone_number
- wtitle = ws.requested_workshop_title.workshoptype_name
-
- #For Instructor
+ client_data = request.POST
+ action = request.POST.get('action')
+ if action == 'accept':
+ workshop = Workshop.objects.get(id=client_data.get('workshop_id'))
+ # Change Status of the selected workshop
+ workshop.status = 1
+ workshop.instructor = user
+ workshop.save()
+ # Parameters for emails
+ coordinator_email = workshop.coordinator.email
+ coordinator_name = workshop.coordinator.profile.user.get_full_name()
+ coordinator_phone = workshop.coordinator.profile.phone_number
+ coordinator_institute = workshop.coordinator.profile.institute
+ instructor_phone = request.user.profile.phone_number
+ workshop_title = workshop.workshop_type.name
+ workshop_date = str(workshop.date)
+
+ # For Instructor
send_email(request, call_on='Booking Confirmed',
- user_position='instructor',
- workshop_date=str(client_data[1]),
- workshop_title=wtitle,
- user_name=str(cname),
- other_email=cmail,
- phone_number=cnum,
- institute=cinstitute
- )
-
- #For Coordinator
+ user_position='instructor',
+ workshop_date=workshop_date,
+ workshop_title=workshop_title,
+ user_name=str(coordinator_name),
+ other_email=coordinator_email,
+ phone_number=coordinator_phone,
+ institute=coordinator_institute
+ )
+
+ # For Coordinator
send_email(request, call_on='Booking Confirmed',
- workshop_date=str(client_data[1]),
- workshop_title=wtitle,
- other_email=cmail,
- phone_number=inum
- )
-
- elif client_data[-1] == 'DELETED':
- workshop_date = client_data[1]
- workshops_list = Workshop.objects.filter(workshop_instructor=request.user.id,
- workshop_title_id=client_data[2]
- )
-
- today = datetime.now() + dt.timedelta(days=3)
- upto = datetime.now() + dt.timedelta(weeks=52)
- for workshop in workshops_list:
- workshop_recurrence_list = workshop.recurrences.between(
- today,
- upto,
- inc=True
- )
-
- for d in workshop_recurrence_list:
- if workshop_date == d.strftime("%Y-%m-%d"):
- rW_obj = RequestedWorkshop()
- rW_obj.requested_workshop_instructor = request.user
- rW_obj.requested_workshop_coordinator = request.user
- rW_obj.requested_workshop_date = workshop_date
- rW_obj.requested_workshop_title = workshop.workshop_title
- rW_obj.status = client_data[-1]
- rW_obj.save()
- bW_obj = BookedWorkshop()
- bW_obj.booked_workshop_requested = rW_obj
- bW_obj.save()
-
- #For instructor
- send_email(request, call_on='Workshop Deleted',
- workshop_date=str(client_data[1]),
- workshop_title=workshop.workshop_title
- )
-
- return HttpResponse("Workshop Deleted")
-
- elif client_data[-1] == 'APPROVED':
- workshop_date = datetime.strptime(
- client_data[1], "%Y-%m-%d"
- )
-
- coordinator_obj = User.objects.get(username=client_data[0][2:])
- workshop_status = ProposeWorkshopDate.objects.get(
- proposed_workshop_date=workshop_date,
- proposed_workshop_coordinator=coordinator_obj.id,
- proposed_workshop_title=client_data[2]
- )
-
- workshop_status.status = 'ACCEPTED'
- workshop_status.proposed_workshop_instructor = user
- workshop_status.save()
- booked_workshop_obj = BookedWorkshop()
- booked_workshop_obj.booked_workshop_proposed = workshop_status
- booked_workshop_obj.save()
- ws = workshop_status
- cmail = ws.proposed_workshop_coordinator.email
- cname = ws.proposed_workshop_coordinator.profile.user.get_full_name()
- cnum = ws.proposed_workshop_coordinator.profile.phone_number
- cinstitute = ws.proposed_workshop_coordinator.profile.institute
- inum = request.user.profile.phone_number
- wtitle = ws.proposed_workshop_title.workshoptype_name
-
- #For Instructor
- send_email(request, call_on='Booking Confirmed',
- user_position='instructor',
- workshop_date=str(client_data[1]),
- workshop_title=wtitle,
- user_name=str(cname),
- other_email=cmail,
- phone_number=cnum,
- institute=cinstitute
- )
-
- #For Coordinator
- send_email(request, call_on='Booking Confirmed',
- workshop_date=str(client_data[1]),
- workshop_title=wtitle,
- other_email=cmail,
- phone_number=inum
- )
-
- elif client_data[-1] == 'CHANGE_DATE':
- temp, iid = client_data[0].split("=")
- temp, new_workshop_date = client_data[-2].split("%3D")
- cid, workshop_title_id = client_data[1], client_data[2]
- new_workshop_date = datetime.strptime(
- new_workshop_date, "%Y-%m-%d"
- )
- workshop_date = datetime.strptime(
- client_data[3], "%Y-%m-%d"
- )
-
- cemail = User.objects.get(id=cid)
+ workshop_date=workshop_date,
+ workshop_title=workshop_title,
+ other_email=coordinator_email,
+ phone_number=instructor_phone
+ )
+
+ elif action == 'change_date':
+ cid = client_data.get('cid')
+ new_workshop_date = datetime.strptime(client_data.get('new_date'), "%Y-%m-%d")
+ coordinator_email = User.objects.get(id=cid)
today = datetime.today()
if today > new_workshop_date:
- return HttpResponse("Please Give proper Date!")
+ # Invalid date
+ pass
else:
- result = RequestedWorkshop.objects.filter(
- requested_workshop_instructor=user.id,
- requested_workshop_coordinator=cid,
- requested_workshop_title_id=workshop_title_id,
- requested_workshop_date=workshop_date).update(
- requested_workshop_date=new_workshop_date)
- if result:
- del temp
- else:
- ProposeWorkshopDate.objects.filter(
- proposed_workshop_instructor=user.id,
- proposed_workshop_coordinator=cid,
- proposed_workshop_title_id=workshop_title_id,
- proposed_workshop_date=workshop_date).update(
- proposed_workshop_date=new_workshop_date)
-
- #For Instructor
- send_email(request, call_on='Change Date',
- user_position='instructor',
- workshop_date=workshop_date.date(),
- new_workshop_date=str(new_workshop_date.date())
- )
-
- #For Coordinator
- send_email(request, call_on='Change Date',
- new_workshop_date=str(new_workshop_date.date()),
- workshop_date=str(workshop_date.date()),
- other_email=cemail.email
- )
-
- return HttpResponse("Date Changed")
-
- else:
- workshop_date = datetime.strptime(
- client_data[1], "%Y-%m-%d"
- )
- coordinator_obj = User.objects.get(username=client_data[0][2:])
- workshop_status = RequestedWorkshop.objects.get(
- requested_workshop_instructor=user.id,
- requested_workshop_date=workshop_date,
- requested_workshop_coordinator=coordinator_obj.id,
- requested_workshop_title=client_data[2]
- )
- workshop_status.status = client_data[-1]
- workshop_status.save()
- ws = workshop_status
- wtitle = ws.requested_workshop_title.workshoptype_name
- cmail = ws.requested_workshop_coordinator.email
- cname = ws.requested_workshop_coordinator.profile.user.get_full_name()
- cnum = ws.requested_workshop_coordinator.profile.phone_number
- cinstitute = ws.requested_workshop_coordinator.profile.institute
-
- #For Instructor
- send_email(request, call_on='Booking Request Rejected',
- user_position='instructor',
- workshop_date=str(client_data[1]),
- workshop_title=wtitle,
- user_name=str(cname),
- other_email=cmail,
- phone_number=cnum,
- institute=cinstitute
- )
-
- #For Coordinator
- send_email(request, call_on='Booking Request Rejected',
- workshop_date=str(client_data[1]),
- workshop_title=wtitle,
- other_email=cmail
- )
-
- workshops = []
- today = datetime.today().date()
- workshop_occurence_list = RequestedWorkshop.objects.filter(
- requested_workshop_instructor=user.id,
- requested_workshop_date__gte=today,
- ).order_by('-requested_workshop_date')
-
- proposed_workshop = ProposeWorkshopDate.objects.filter(
- proposed_workshop_instructor=user.id,
- proposed_workshop_date__gte=today,
- ).order_by('-proposed_workshop_date')
-
- proposed_workshop_pending = ProposeWorkshopDate.objects.filter(
- status='Pending'
- ).order_by('-proposed_workshop_date')
-
- workshops = list(workshop_occurence_list) + list(proposed_workshop) + list(proposed_workshop_pending)
-
- # team_members = list(set(user.profile.team_set.all().values_list('members', flat=True)))
- teams = Team.objects.filter(members=user.profile)
-
- if teams:
- team_members = Profile.objects.filter(team__in=teams).exclude(id=user.profile.id).distinct()
- team_member_ids = team_members.values_list('user__id')
- team_workshops = ProposeWorkshopDate.objects.filter(
- proposed_workshop_date__gte=today,
- proposed_workshop_instructor_id__in=team_member_ids,
- )
+ workshop = Workshop.objects.filter(id=client_data.get('workshop_id'))
+ workshop_date = workshop.first().date
+ workshop.update(date=new_workshop_date)
+
+ # For Instructor
+ send_email(request, call_on='Change Date',
+ user_position='instructor',
+ workshop_date=str(workshop_date),
+ new_workshop_date=str(new_workshop_date.date())
+ )
+
+ # For Coordinator
+ send_email(request, call_on='Change Date',
+ new_workshop_date=str(new_workshop_date.date()),
+ workshop_date=str(workshop_date),
+ other_email=coordinator_email.email
+ )
+
+ today = timezone.now()
+ proposed_workshop = Workshop.objects.filter(
+ instructor=user.id,
+ date__gte=today,
+ ).order_by('-date')
+
+ proposed_workshop_pending = Workshop.objects.filter(
+ status=0
+ ).order_by('-date')
+
+ workshops = list(proposed_workshop) + list(proposed_workshop_pending)
return render(request, 'workshop_app/my_workshops.html',
- { "workshops" :workshops,
- "team_workshops": team_workshops,
- "today": today})
+ {"workshops": workshops,
+ "today": today})
+ # Coordinator view
else:
- workshops = []
- workshop_occurence_list = RequestedWorkshop.objects.filter(
- requested_workshop_coordinator=user.id
- ).order_by('-requested_workshop_date')
-
- proposed_workshop = ProposeWorkshopDate.objects.filter(
- proposed_workshop_coordinator=user.id
- ).order_by('-proposed_workshop_date')
-
- workshops = list(workshop_occurence_list) + list(proposed_workshop)
-
+ workshops = Workshop.objects.filter(
+ coordinator=user.id
+ ).order_by('-date')
return render(request, 'workshop_app/my_workshops.html',
- {"workshops": workshops})
+ {"workshops": workshops})
+ # Not logged in view
else:
return redirect('/login/')
+# TODO: Show terms n conditions of selected ws type
@login_required
def propose_workshop(request):
- '''Coordinator proposed a workshop and date'''
+ """Coordinator proposed a workshop and date"""
user = request.user
- if is_superuser(user):
+ if user.is_superuser:
return redirect("/admin")
- if is_email_checked(user):
- if is_instructor(user):
- return redirect('/manage/')
- else:
- if request.method == 'POST':
- form = ProposeWorkshopDateForm(request.POST)
- if form.is_valid():
- form_data = form.save(commit=False)
- form_data.proposed_workshop_coordinator = user
- #Avoiding Duplicate workshop entries for same date and workshop_title
- if ProposeWorkshopDate.objects.filter(
- proposed_workshop_date=form_data.proposed_workshop_date,
- proposed_workshop_title=form_data.proposed_workshop_title,
- proposed_workshop_coordinator=form_data.proposed_workshop_coordinator
- ).exists():
- return redirect('/my_workshops/')
- else:
- form_data.proposed_workshop_coordinator.save()
- form_data.save()
- instructors = Profile.objects.filter(position='instructor')
- for i in instructors:
- send_email(request, call_on='Proposed Workshop',
- user_position='instructor',
- workshop_date=str(form_data.proposed_workshop_date),
- workshop_title=form_data.proposed_workshop_title,
- user_name=str(user.get_full_name()),
- other_email=i.user.email,
- phone_number=user.profile.phone_number,
- institute=user.profile.institute
- )
- return redirect('/my_workshops/')
- else:
- form = ProposeWorkshopDateForm()
- return render(
- request, 'workshop_app/propose_workshop.html',
- {"form": form }
- )
+ if is_instructor(user):
+ return redirect(get_landing_page(user))
else:
- return render(request, 'workshop_app/activation.html')
-
-
-@login_required
-def view_profile(request):
- """ view instructor and coordinator profile """
- user = request.user
- if is_superuser(user):
- return redirect('/admin')
- if is_email_checked(user) and user.is_authenticated():
- return render(request, "workshop_app/view_profile.html")
- else:
- if user.is_authenticated():
- return render(request, 'workshop_app/activation.html')
- else:
- try:
- logout(request)
- return redirect('/login/')
- except:
- return redirect('/register/')
-
-
-@login_required
-def edit_profile(request):
- """ edit profile details facility for instructor and coordinator """
-
- user = request.user
- if is_superuser(user):
- return redirect('/admin')
- if is_email_checked(user):
- if is_instructor(user):
- template = 'workshop_app/manage.html'
- else:
- template = 'workshop_app/booking.html'
- else:
- try:
- logout(request)
- return redirect('/login/')
- except:
- return redirect('/register/')
-
- context = {'template': template}
- if has_profile(user) and is_email_checked(user):
- profile = Profile.objects.get(user_id=user.id)
- else:
- profile = None
-
- if request.method == 'POST':
- form = ProfileForm(request.POST, user=user, instance=profile)
- if form.is_valid():
- form_data = form.save(commit=False)
- form_data.user = user
- form_data.user.first_name = request.POST['first_name']
- form_data.user.last_name = request.POST['last_name']
- form_data.user.save()
- form_data.save()
-
- return render(
- request, 'workshop_app/profile_updated.html'
- )
- else:
- context['form'] = form
- return render(request, 'workshop_app/edit_profile.html', context)
- else:
- form = ProfileForm(user=user, instance=profile)
- return render(request, 'workshop_app/edit_profile.html', {'form': form})
-
-
-@login_required
-def create_workshop(request):
- '''Instructor creates workshops'''
-
- user = request.user
- if is_superuser(user):
- return redirect("/admin")
- if is_instructor(user) and is_email_checked(user):
+ form = WorkshopForm()
if request.method == 'POST':
- form = CreateWorkshop(request.POST)
+ form = WorkshopForm(request.POST)
if form.is_valid():
form_data = form.save(commit=False)
- #form_data.profile_id = profile.id
- form_data.workshop_instructor = user
- form_data.workshop_instructor.save()
- form_data.save()
- return redirect('/manage/')
- else:
- form = CreateWorkshop()
+ form_data.coordinator = user
+ # Avoiding Duplicate workshop entries for same date and workshop_title
+ if Workshop.objects.filter(
+ date=form_data.date,
+ workshop_type=form_data.workshop_type,
+ coordinator=form_data.coordinator
+ ).exists():
+ return redirect('/my_workshops/')
+ else:
+ form_data.save()
+ instructors = Profile.objects.filter(position='instructor')
+ for i in instructors:
+ send_email(request, call_on='Proposed Workshop',
+ user_position='instructor',
+ workshop_date=str(form_data.date),
+ workshop_title=form_data.workshop_type,
+ user_name=user.get_full_name(),
+ other_email=i.user.email,
+ phone_number=user.profile.phone_number,
+ institute=user.profile.institute
+ )
+ return redirect('/my_workshops/')
+ # GET request
return render(
- request, 'workshop_app/create_workshop.html',
- {"form": form }
- )
- else:
- return redirect('/book/')
+ request, 'workshop_app/propose_workshop.html',
+ {"form": form}
+ )
-def view_workshoptype_details(request, workshoptype_id):
- '''Gives the types of workshop details '''
+def workshop_type_details(request, workshop_type_id):
+ """Gives the types of workshop details """
user = request.user
- if is_superuser(user):
+ if user.is_superuser:
return redirect("/admin")
- view_workshoptype_details = WorkshopType.objects.get(id=workshoptype_id)
+ workshop_type = WorkshopType.objects.get(id=workshop_type_id)
return render(
- request, 'workshop_app/view_workshoptype_details.html', \
- {'workshoptype': view_workshoptype_details}
- )
+ request, 'workshop_app/workshop_type_details.html', {'workshop_type': workshop_type}
+ )
-def view_workshoptype_list(request):
- '''Gives the details for types of workshops.'''
+def workshop_type_list(request):
+ """Gives the details for types of workshops."""
user = request.user
- if is_superuser(user):
+ if user.is_superuser:
return redirect("/admin")
- workshoptype_list = WorkshopType.objects.all()
+ workshop_types = WorkshopType.objects.all()
- paginator = Paginator(workshoptype_list, 12) #Show upto 12 workshops per page
+ paginator = Paginator(workshop_types, 12) # Show upto 12 workshops per page
page = request.GET.get('page')
- try:
- workshoptype = paginator.page(page)
- except PageNotAnInteger:
- #If page is not an integer, deliver first page.
- workshoptype = paginator.page(1)
- except EmptyPage:
- #If page is out of range(e.g 999999), deliver last page.
- workshoptype = paginator.page(paginator.num_pages)
-
- return render(
- request, 'workshop_app/view_workshoptype_list.html', \
- {'workshoptype': workshoptype}
- )
-
-
-def faq(request):
- return render(request, 'workshop_app/view_faq.html')
-
-
-def how_to_participate(request):
- return render(request, 'workshop_app/how_to_participate.html')
-
-
-def file_view(request, workshop_title):
- if workshop_title =='flowchart':
- return render(request, 'workshop_app/how_to_participate.html')
- else:
- filename = WorkshopType.objects.get(id=workshop_title)
- attachment_path = path.dirname(filename.workshoptype_attachments.path)
- zipfile_name = string_io()
- zipfile = ZipFile(zipfile_name, "w")
- attachments = listdir(attachment_path)
- for file in attachments:
- file_path = sep.join((attachment_path, file))
- zipfile.write(file_path, path.basename(file_path))
- zipfile.close()
- zipfile_name.seek(0)
- response = HttpResponse(content_type='application/zip')
- response['Content-Disposition'] = 'attachment; filename={0}.zip'.format(
- filename.workshoptype_name.replace(" ", "_")
- )
- response.write(zipfile_name.read())
- return response
-
-
-
-def check_workshop_type(x):
- try:
- y = datetime.strftime(x.proposed_workshop_date, '%d-%m-%Y')
- except:
- y = datetime.strftime(x.requested_workshop_date, '%d-%m-%Y')
- return y
-
-
-@login_required
-def workshop_stats(request):
- user = request.user
- today = datetime.now()
- upto = today + dt.timedelta(days=120)
-
- #For Monthly Chart
- workshop_count = [0] * 12
- for x in range(12):
- workshop_count[x] +=RequestedWorkshop.objects.filter(
- requested_workshop_date__year=str(today.year),
- requested_workshop_date__month=str(x+1),
- status='ACCEPTED').count()
- workshop_count[x] +=ProposeWorkshopDate.objects.filter(
- proposed_workshop_date__year=str(today.year),
- proposed_workshop_date__month=str(x+1),
- status='ACCEPTED').count()
-
- # Count Total Number of workshops for each type
- workshop_titles = WorkshopType.objects.all()
- workshoptype_dict = {}
- for title in workshop_titles:
- workshoptype_dict[title]=0
-
- for title in workshoptype_dict.keys():
- workshoptype_dict[title] += RequestedWorkshop.objects.filter(
- requested_workshop_title=title,
- status='ACCEPTED').count()
- workshoptype_dict[title] += ProposeWorkshopDate.objects.filter(
- proposed_workshop_title=title,
- status='ACCEPTED').count()
- #For Pie Chart
- workshoptype_num = []
- workshoptype_title = []
- for title in workshoptype_dict.keys():
- workshoptype_title.append(str(title))
-
- for count in workshoptype_dict.values():
- workshoptype_num.append(count)
-
- workshoptype_count = [workshoptype_title, workshoptype_num]
- del workshoptype_title, workshoptype_num
-
- # For India Map
- states = [
- ['Code', 'State', 'Number'],
- ["IN-AP", "Andhra Pradesh", 0],
- ["IN-AR", "Arunachal Pradesh", 0],
- ["IN-AS", "Assam", 0],
- ["IN-BR", "Bihar", 0],
- ["IN-CT", "Chhattisgarh", 0],
- ["IN-GA", "Goa", 0],
- ["IN-GJ", "Gujarat", 0],
- ["IN-HR", "Haryana", 0],
- ["IN-HP", "Himachal Pradesh", 0],
- ["IN-JK", "Jammu and Kashmir", 0],
- ["IN-JH", "Jharkhand", 0],
- ["IN-KA", "Karnataka", 0],
- ["IN-KL", "Kerala", 0],
- ["IN-MP", "Madhya Pradesh", 0],
- ["IN-MH", "Maharashtra", 0],
- ["IN-MN", "Manipur", 0],
- ["IN-ML", "Meghalaya", 0],
- ["IN-MZ", "Mizoram", 0],
- ["IN-NL", "Nagaland", 0],
- ["IN-OR", "Odisha", 0],
- ["IN-PB", "Punjab", 0],
- ["IN-RJ", "Rajasthan", 0],
- ["IN-SK", "Sikkim", 0],
- ["IN-TN", "Tamil Nadu", 0],
- ["IN-TG", "Telangana", 0],
- ["IN-TR", "Tripura", 0],
- ["IN-UT", "Uttarakhand", 0],
- ["IN-UP", "Uttar Pradesh", 0],
- ["IN-WB", "West Bengal", 0],
- ["IN-AN", "Andaman and Nicobar Islands", 0],
- ["IN-CH", "Chandigarh", 0],
- ["IN-DN", "Dadra and Nagar Haveli", 0],
- ["IN-DD", "Daman and Diu", 0],
- ["IN-DL", "Delhi", 0],
- ["IN-LD", "Lakshadweep", 0],
- ["IN-PY", "Puducherry", 0]
- ]
-
- workshop_state = []
- requestedWorkshops = RequestedWorkshop.objects.filter(status='ACCEPTED')
- proposedWorkshops = ProposeWorkshopDate.objects.filter(status='ACCEPTED')
- for workshop in requestedWorkshops:
- for s in states:
- if s[0] == workshop.requested_workshop_coordinator.profile.state:
- s[2] +=1
-
- for workshop in proposedWorkshops:
- for s in states:
- if s[0] == workshop.proposed_workshop_coordinator.profile.state:
- s[2] +=1
-
- #For Data Downloading and Viewing
- if request.method == 'POST':
- try:
- from_dates = request.POST.get('from')
- to_dates = request.POST.get('to')
-
- #Fetches Accepted workshops which were proposed by Coordinators
- proposed_workshops = ProposeWorkshopDate.objects.filter(
- proposed_workshop_date__range=(from_dates, to_dates),
- status='ACCEPTED'
- )
-
- # Fetches Accepted workshops which were Accepted by
- # Instructors based on their Availability
- requested_workshops = RequestedWorkshop.objects.filter(
- requested_workshop_date__range=(from_dates, to_dates),
- status='ACCEPTED'
- )
-
- upcoming_workshops = []
-
- for workshop in proposed_workshops:
- upcoming_workshops.append(workshop)
-
- for workshop in requested_workshops:
- upcoming_workshops.append(workshop)
-
- upcoming_workshops = sorted(upcoming_workshops,
- key=lambda x: check_workshop_type(x))
-
- download = request.POST.get('Download')
- if download:
- response = HttpResponse(content_type='text/csv')
-
- response['Content-Disposition'] = 'attachment;\
- filename="records_from_{0}_to_{1}.csv"'.format(
- from_dates,to_dates
- )
-
- writer = csv.writer(response)
- header = [
- 'coordinator name',
- 'instructor name',
- 'workshop',
- 'date',
- 'status',
- 'institute name'
- ]
-
- writer.writerow(header)
-
- for workshop in upcoming_workshops:
- try:
- row = [
- workshop.proposed_workshop_coordinator,
- workshop.proposed_workshop_instructor,
- workshop.proposed_workshop_title,
- workshop.proposed_workshop_date,
- workshop.status,
- workshop.proposed_workshop_coordinator.profile.institute
- ]
-
- except:
- row = [
- workshop.requested_workshop_coordinator,
- workshop.requested_workshop_instructor,
- workshop.requested_workshop_title,
- workshop.requested_workshop_date,
- workshop.status,
- workshop.requested_workshop_coordinator.profile.institute
- ]
-
- writer.writerow(row)
- return response
- else:
- return render(request, 'workshop_app/workshop_stats.html',
- {
- "upcoming_workshops": upcoming_workshops,
- "show_workshop_stats": settings.SHOW_WORKSHOP_STATS,
- "workshop_count": workshop_count,
- "workshoptype_count": workshoptype_count,
- "india_map": states
- })
- except:
- messages.info(request, 'Please enter Valid Dates')
-
- if is_instructor(user) and is_email_checked(user):
- try:
- #Fetches Accepted workshops which were proposed by Coordinators
- proposed_workshops = ProposeWorkshopDate.objects.filter(
- proposed_workshop_date__range=(today, upto),
- status='ACCEPTED'
- )
-
- #Fetches Accepted workshops which were Accepted by
- # Instructors based on their Availability
- requested_workshops = RequestedWorkshop.objects.filter(
- requested_workshop_date__range=(today, upto),
- status='ACCEPTED'
- )
-
- upcoming_workshops = []
- for workshop in proposed_workshops:
- upcoming_workshops.append(workshop)
-
- for workshop in requested_workshops:
- upcoming_workshops.append(workshop)
-
- upcoming_workshops = sorted(upcoming_workshops,
- key=lambda x: check_workshop_type(x))
-
- except:
- upcoming_workshops = None
-
- paginator = Paginator(upcoming_workshops, 12)
-
- page = request.GET.get('page')
- try:
- upcoming_workshops = paginator.page(page)
- except PageNotAnInteger:
- #If page is not an integer, deliver first page.
- upcoming_workshops = paginator.page(1)
- except EmptyPage:
- #If page is out of range(e.g 999999), deliver last page.
- upcoming_workshops = paginator.page(paginator.num_pages)
-
-
- return render(request, 'workshop_app/workshop_stats.html',
- {
- "upcoming_workshops": upcoming_workshops,
- "show_workshop_stats": settings.SHOW_WORKSHOP_STATS,
- "workshop_count": workshop_count,
- "workshoptype_count": workshoptype_count,
- "india_map": states
- })
- else:
- return redirect('/manage/')
-
-
-def self_workshop(request):
- return render(request, "workshop_app/self_workshop.html")
+ workshop_type = paginator.get_page(paginator.num_pages)
+ return render(request, 'workshop_app/workshop_type_list.html', {'workshop_type': workshop_type})
@login_required
def view_comment_profile(request, user_id):
- '''instructor can view/post comments on coordinator profile '''
+ """instructor can view/post comments on coordinator profile """
user = request.user
if is_instructor(user) and is_email_checked(user):
- comment_form = ProfileCommentsForm()
coordinator_profile = Profile.objects.get(user_id=user_id)
- requested_workshop = RequestedWorkshop.objects.filter(requested_workshop_coordinator=user_id).order_by(
- 'requested_workshop_title')
- propose_workshop = ProposeWorkshopDate.objects.filter(proposed_workshop_coordinator=user_id).order_by(
- 'proposed_workshop_date')
- workshops=[]
- for workshop in propose_workshop:
- workshops.append(workshop)
-
- for workshop in requested_workshop:
- workshops.append(workshop)
- try:
- comments = ProfileComments.objects.filter(coordinator_profile_id=user_id).order_by('-created_date')
- except:
- comments = None
- if request.method == 'POST':
- comment_formpost = ProfileCommentsForm(request.POST)
- if comment_formpost.is_valid():
- form_data = comment_formpost.save(commit=False)
- form_data.coordinator_profile_id = user_id
- form_data.instructor_profile_id = user.id
- form_data.save()
+ workshops = Workshop.objects.filter(coordinator=user_id).order_by(
+ 'date')
- return render(request, "workshop_app/view_comment_profile.html",
- {"coordinator_profile": coordinator_profile,
- "comments": comments,
- "comment_form": comment_form
- })
- else:
- if comments is not None:
- #Show upto 12 Workshops per page
- paginator = Paginator(comments, 12)
- page = request.GET.get('page')
- try:
- comments = paginator.page(page)
- except PageNotAnInteger:
- #If page is not an integer, deliver first page.
- comments = paginator.page(1)
- except EmptyPage:
- #If page is out of range(e.g 999999), deliver last page.
- comments = paginator.page(paginator.num_pages)
- workshop={}
- return render(request, "workshop_app/view_comment_profile.html",
- {"coordinator_profile": coordinator_profile,
- "comments": comments,
- "comment_form": comment_form,
- "Workshops":workshops})
- return redirect('/book/')
-
-@login_required
-def download_csv_data(request):
- user=request.user
- if user.profile.position == 'instructor':
- requested_workshop = RequestedWorkshop.objects.filter(requested_workshop_instructor=user.id).order_by(
- 'requested_workshop_title')
- propose_workshop = ProposeWorkshopDate.objects.filter(proposed_workshop_instructor=user.id).order_by(
- 'proposed_workshop_date')
- upcoming_workshops = []
- for workshop in propose_workshop:
- upcoming_workshops.append(workshop)
-
- for workshop in requested_workshop:
- upcoming_workshops.append(workshop)
-
- response = HttpResponse(content_type='text/csv')
-
- response['Content-Disposition'] = 'attachment;\
- filename="records_of_{0}.csv"'.format(
- user.username
- )
-
- writer = csv.writer(response)
- header = [
- 'coordinator name',
- 'instructor name',
- 'workshop',
- 'date',
- 'status',
- 'institute name'
- ]
-
- writer.writerow(header)
-
- for workshop in upcoming_workshops:
- try:
- row = [
- workshop.proposed_workshop_coordinator,
- workshop.proposed_workshop_instructor,
- workshop.proposed_workshop_title,
- workshop.proposed_workshop_date,
- workshop.status,
- workshop.proposed_workshop_coordinator.profile.institute
- ]
-
- except:
- row = [
- workshop.requested_workshop_coordinator,
- workshop.requested_workshop_instructor,
- workshop.requested_workshop_title,
- workshop.requested_workshop_date,
- workshop.status,
- workshop.requested_workshop_coordinator.profile.institute
- ]
-
- writer.writerow(row)
- return response
-
- else:
- return redirect('/book/')
+ return render(request, "workshop_app/view_profile.html",
+ {"coordinator_profile": coordinator_profile,
+ "Workshops": workshops})
+ return redirect(get_landing_page(user))
diff --git a/workshop_portal/settings.py b/workshop_portal/settings.py
index 46dc9b7..f1805d2 100644
--- a/workshop_portal/settings.py
+++ b/workshop_portal/settings.py
@@ -13,17 +13,17 @@ https://docs.djangoproject.com/en/1.10/ref/settings/
import os
import sys
from local_settings import (
- EMAIL_HOST,
- EMAIL_PORT,
- EMAIL_HOST_USER,
- EMAIL_HOST_PASSWORD,
- EMAIL_USE_TLS,
- SENDER_EMAIL
- )
+ EMAIL_HOST,
+ EMAIL_PORT,
+ EMAIL_HOST_USER,
+ EMAIL_HOST_PASSWORD,
+ EMAIL_USE_TLS,
+ SENDER_EMAIL
+)
+
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
@@ -35,7 +35,6 @@ DEBUG = True
ALLOWED_HOSTS = []
-
# Application definition
INSTALLED_APPS = [
@@ -51,15 +50,13 @@ INSTALLED_APPS = [
'teams',
]
-MIDDLEWARE_CLASSES = [
+MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
-
]
ROOT_URLCONF = 'workshop_portal.urls'
@@ -85,15 +82,14 @@ WSGI_APPLICATION = 'workshop_portal.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
DATABASES = {
- 'default': {
+ 'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'TEST': {
'NAME': 'mytestdatabase',
},
- }
}
-
+}
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
@@ -113,7 +109,6 @@ AUTH_PASSWORD_VALIDATORS = [
},
]
-
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
@@ -127,7 +122,6 @@ USE_L10N = True
USE_TZ = True
-
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
@@ -143,7 +137,7 @@ MEDIA_ROOT = os.path.join(BASE_DIR, "workshop_app", "data")
LOG_FOLDER = os.path.join(BASE_DIR, "workshop_app", "logs")
-#Email Connection Settings
+# Email Connection Settings
EMAIL_HOST = EMAIL_HOST
EMAIL_HOST_USER = EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = EMAIL_HOST_PASSWORD
@@ -154,12 +148,12 @@ SENDER_EMAIL = SENDER_EMAIL
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
-#Change this to the production url
-PRODUCTION_URL = 'your_production_url'
+# Change this to the production url
+PRODUCTION_URL = 'http://localhost:8000'
ADMIN_EMAIL = 'your admin email'
-#Set True or False to view/hide
+# Set True or False to view/hide
SHOW_WORKSHOP_STATS = True
LOGIN_REDIRECT_URL = '/profile'
diff --git a/workshop_portal/urls.py b/workshop_portal/urls.py
index bf603d1..d4ddb1c 100644
--- a/workshop_portal/urls.py
+++ b/workshop_portal/urls.py
@@ -27,7 +27,5 @@ js_info_dict = {
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('workshop_app.urls')),
- url(r'^', include('workshop_app.urls_password_reset')),
- url(r'^', include('statistics_app.urls')),
]