Skip to content
This repository has been archived by the owner on Jan 26, 2021. It is now read-only.

Commit

Permalink
feat: Added Meetup History Backend
Browse files Browse the repository at this point in the history
Added Ipware and Scripts

Dropdown Revamp

Added Meetup History Backend
  • Loading branch information
ritwickraj78 authored and SanketDG committed Aug 1, 2020
1 parent 97a6d46 commit 926dc5e
Show file tree
Hide file tree
Showing 12 changed files with 152 additions and 10 deletions.
3 changes: 2 additions & 1 deletion requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ pytest-pylint==0.17.0
selenium==3.141.0
djangorestframework==3.11.0
geopy==2.0.0
pinax-notifications==6.0.0
pinax-notifications==6.0.0

1 change: 1 addition & 0 deletions requirements/prod.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ python3-openid==3.2.0
geoip2==4.0.1
django-ipware==3.0.0
django-apscheduler==0.3.1

3 changes: 3 additions & 0 deletions systers_portal/meetup/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

from meetup.models import (Meetup, Rsvp, SupportRequest, RequestMeetup)

from meetup.models import MeetupImages

admin.site.register(Meetup)
admin.site.register(Rsvp)
admin.site.register(SupportRequest)
admin.site.register(RequestMeetup)
admin.site.register(MeetupImages)
41 changes: 39 additions & 2 deletions systers_portal/meetup/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
from common.helpers import SubmitCancelFormHelper
from meetup.models import (Meetup, Rsvp, SupportRequest,
RequestMeetup)
from multiupload.fields import MultiFileField
from users.models import SystersUser
from common.models import Comment

from meetup.models import MeetupImages


class RequestMeetupForm(ModelFormWithHelper):
""" Form to create a new Meetup Request. """
Expand Down Expand Up @@ -63,12 +66,14 @@ class AddMeetupForm(ModelFormWithHelper):
class Meta:
model = Meetup
fields = ('title', 'slug', 'date', 'time', 'meetup_location', 'venue', 'description',
'meetup_picture')
'resources')
widgets = {'date': forms.DateInput(attrs={'type': 'text', 'class': 'datepicker'}),
'time': forms.TimeInput(attrs={'type': 'text', 'class': 'timepicker'})}
helper_class = SubmitCancelFormHelper
helper_cancel_href = "{% url 'index' %}"

images = MultiFileField(required=False)

def __init__(self, *args, **kwargs):
self.created_by = kwargs.pop('created_by')
self.leader = kwargs.pop('leader')
Expand All @@ -81,6 +86,9 @@ def save(self, commit=True):
instance.leader = SystersUser.objects.get(user=self.created_by)
if commit:
instance.save()
if self.cleaned_data['images']:
for img in self.cleaned_data['images']:
MeetupImages.objects.create(image=img, meetup=instance)
return instance

def clean_date(self):
Expand All @@ -104,14 +112,25 @@ def clean_time(self):
class EditMeetupForm(ModelFormWithHelper):
"""Form to edit Meetup"""

images = MultiFileField(required=False)

class Meta:
model = Meetup
fields = ('title', 'slug', 'date', 'time', 'description', 'venue')
fields = ('title', 'slug', 'date', 'time', 'description', 'venue',)
widgets = {'date': forms.DateInput(attrs={'type': 'date', 'class': 'datepicker'}),
'time': forms.TimeInput(attrs={'type': 'time', 'class': 'timepicker'})}
helper_class = SubmitCancelFormHelper
helper_cancel_href = "{% url 'view_meetup' meetup.slug %}"

def save(self, commit=True):
"""Override save to add created_by and meetup_location to the instance"""
instance = super(EditMeetupForm, self).save(commit)
MeetupImages.objects.filter(meetup=instance).delete()
if self.cleaned_data['images']:
for img in self.cleaned_data['images']:
MeetupImages.objects.create(image=img, meetup=instance)
return instance


class AddMeetupCommentForm(ModelFormWithHelper):
"""Form to add a comment to a Meetup"""
Expand Down Expand Up @@ -240,3 +259,21 @@ class Meta:
helper_class = SubmitCancelFormHelper
helper_cancel_href = "{% url 'view_support_request' meetup.slug" \
" support_request.pk %}"


class PastMeetup(ModelFormWithHelper):
images = MultiFileField(required=False)

class Meta:
model = Meetup
fields = ('resources',)
helper_class = SubmitCancelFormHelper
helper_cancel_href = "{% url 'view_meetup' meetup.slug %}"

def save(self, commit=True):
"""Override save to add created_by and meetup_location to the instance"""
instance = super(PastMeetup, self).save(commit)
if self.cleaned_data['images']:
for img in self.cleaned_data['images']:
MeetupImages.objects.create(image=img, meetup=instance)
return instance
38 changes: 38 additions & 0 deletions systers_portal/meetup/migrations/0007_auto_20200706_0949.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2020-07-06 09:49
from __future__ import unicode_literals

import ckeditor.fields
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('meetup', '0006_auto_20200620_2146'),
]

operations = [
migrations.CreateModel(
name='MeetupImages',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image', models.FileField(upload_to='meetup/images', verbose_name='Meetup Image')),
],
),
migrations.RemoveField(
model_name='meetup',
name='meetup_picture',
),
migrations.AddField(
model_name='meetup',
name='resources',
field=ckeditor.fields.RichTextField(null=True, verbose_name='Meetup Resources'),
),
migrations.AddField(
model_name='meetupimages',
name='meetup',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='meetup.Meetup', verbose_name='Meetup'),
),
]
21 changes: 21 additions & 0 deletions systers_portal/meetup/migrations/0008_auto_20200706_1124.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2020-07-06 11:24
from __future__ import unicode_literals

import ckeditor.fields
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('meetup', '0007_auto_20200706_0949'),
]

operations = [
migrations.AlterField(
model_name='meetup',
name='resources',
field=ckeditor.fields.RichTextField(blank=True, null=True, verbose_name='Meetup Resources'),
),
]
10 changes: 6 additions & 4 deletions systers_portal/meetup/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@ class Meetup(models.Model):
created_by = models.ForeignKey(
SystersUser, null=True, verbose_name="Created By", on_delete=models.CASCADE)
last_updated = models.DateTimeField(auto_now=True, verbose_name="Last Update")
meetup_picture = models.ImageField(upload_to='meetup/pictures/',
blank=True,
null=True,
verbose_name="Meetup picture")
resources = RichTextField(null=True, verbose_name="Meetup Resources", blank=True)

class Meta:
permissions = (
Expand Down Expand Up @@ -99,3 +96,8 @@ class SupportRequest(models.Model):

def __str__(self):
return "{0} volunteered for meetup {1}".format(self.volunteer, self.meetup)


class MeetupImages(models.Model):
meetup = models.ForeignKey(Meetup, verbose_name="Meetup")
image = models.FileField(upload_to="meetup/images", verbose_name="Meetup Image")
1 change: 0 additions & 1 deletion systers_portal/meetup/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1220,7 +1220,6 @@ def test_post_view(self):
'meetup_slug': 'foobarbaz',
'distance': 900}],
'unit': 'kilometers from your location'})

data5 = {'keyword': 'Foo', 'location': 'Baz'}
response = self.client.post(url, data5, format='json')
self.assertEqual(json.loads(response.content.decode('utf-8')),
Expand Down
4 changes: 3 additions & 1 deletion systers_portal/meetup/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
ApproveRequestMeetupView, RejectMeetupRequestView, ApiForVmsView,
AllUpcomingMeetupsView, AddSupportRequestCommentView,
EditSupportRequestCommentView, DeleteSupportRequestCommentView,
UpcomingMeetupsSearchView)
UpcomingMeetupsSearchView, AddResourceView)

urlpatterns = [
url(r'^upcoming/$', UpcomingMeetupsView.as_view(),
Expand All @@ -23,6 +23,8 @@
name='delete_meetup'),
url(r'^(?P<meetup_slug>[\w-]+)/edit/$', EditMeetupView.as_view(),
name="edit_meetup"),
url(r'^(?P<meetup_slug>[\w-]+)/res/$', AddResourceView.as_view(),
name="add_resource"),
url(r'^request/$', RequestMeetupView.as_view(),
name="request_meetup"),
url(r'^view_meetup_requests/$', NewMeetupRequestsListView.as_view(),
Expand Down
31 changes: 30 additions & 1 deletion systers_portal/meetup/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
EditMeetupCommentForm, RsvpForm, AddSupportRequestForm,
EditSupportRequestForm, AddSupportRequestCommentForm,
EditSupportRequestCommentForm,
RequestMeetupForm)
RequestMeetupForm, PastMeetup)
from .models import (Meetup, Rsvp, SupportRequest,
RequestMeetup)
from .constants import (OK, SLUG_ALREADY_EXISTS, SLUG_ALREADY_EXISTS_MSG,
Expand Down Expand Up @@ -819,3 +819,32 @@ def post(self, request):
results.sort(key=operator.itemgetter('date'))
results.sort(key=operator.itemgetter('distance'))
return JsonResponse({'search_results': results, 'unit': unit}, safe=False)


class AddResourceView(FormValidMessageMixin, FormInvalidMessageMixin, LoginRequiredMixin,
PermissionRequiredMixin, UpdateView):
"""Add Resources and Images to a past meetup"""
template_name = "meetup/edit_meetup.html"
model = Meetup
slug_url_kwarg = "meetup_slug"
form_class = PastMeetup
form_valid_message = (u"Meetup edited Successfully")
form_invalid_message = ERROR_MSG
raise_exception = True

def get_success_url(self):
"""Redirect to meetup view page in case of successful submit"""
return reverse("view_meetup", kwargs={"slug": self.object.slug})

def get_context_data(self, **kwargs):
"""Add Meetup and MeetupLocation objects to the context"""
context = super(AddResourceView, self).get_context_data(**kwargs)
self.meetup = get_object_or_404(Meetup, slug=self.kwargs['meetup_slug'])
context['meetup'] = self.meetup
context['meetup_location'] = self.meetup.meetup_location
return context

def check_permissions(self, request):
"""Check if the request user has the permission to edit a meetup.
The permission holds true for superusers."""
return request.user.has_perm('meetup.change_meetups')
8 changes: 8 additions & 0 deletions systers_portal/static/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -781,3 +781,11 @@ li[id=nav-menu]:hover{
display: block;
}
}
li[id=nav-menu]:hover{
background-color:#54bceb;
}
@media only screen and (min-width: 768px) {
.dropdown:hover .dropdown-menu {
display: block;
}
}
1 change: 1 addition & 0 deletions systers_portal/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@
<script type="text/javascript" src="{% static 'js/community-search.js' %}"></script>
<script src="{% static 'js/choose_profile_pic.js' %}"></script>
<script src="{% static 'js/search_menu.js' %}"></script>
<script src="{% static 'js/main.js' %}"></script>
{% block scripts %}{% endblock %}
</body>
</html>

0 comments on commit 926dc5e

Please sign in to comment.