From c789d32e0f9a09cb386dc5577a628e6c1a09e5a2 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 28 Jun 2020 14:29:04 -0400 Subject: [PATCH 01/11] add gmail to a web container env --- .env.example | 6 +++--- docker-compose.yml | 6 +++--- http_handler/settings.py | 10 ++++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.env.example b/.env.example index 2740505e..5d115fa4 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,7 @@ -# Please enter your gmail username and password -# Also enable insecure logins +# Please enter your gmail address +# Also create an gmail app password GMAIL_USER=YOUR_GMAIL_ACCOUNT@GMAIL.COM -GMAIL_PASSWORD=YOU_GMAIL_PASSWORD +GMAIL_PASSWORD=YOUR_APP_PASSWORD diff --git a/docker-compose.yml b/docker-compose.yml index 03c42de2..937ee67b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,13 +25,13 @@ services: - MYSQL_PASS=${MYSQL_PASS} - DOMAIN_NAME=${DOMAIN_NAME} - DATABASE_HOST=${DATABASE_HOST} + - GMAIL_USER=${GMAIL_USER} + - GMAIL_PASSWORD=${GMAIL_PASSWORD} restart: on-failure smtp: image: namshi/smtp expose: - - 587-8825 - ports: - - "8825" + - 587-8825 environment: - GMAIL_USER=${GMAIL_USER} - GMAIL_PASSWORD=${GMAIL_PASSWORD} diff --git a/http_handler/settings.py b/http_handler/settings.py index a7778ebd..dcc9e878 100644 --- a/http_handler/settings.py +++ b/http_handler/settings.py @@ -59,6 +59,11 @@ def _get_website(): WEBSITE = _get_website() +EMAIL_HOST = 'localhost' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_PORT = 8825 + try: execfile(SITE_ROOT + '/../private.py') except IOError: @@ -81,11 +86,8 @@ def _get_website(): LOGIN_REDIRECT_URL = "/" -EMAIL_HOST = 'localhost' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_HOST_USER = '' -EMAIL_HOST_PASSWORD = '' -EMAIL_USE_TLS = False +EMAIL_USE_TLS = True DEFAULT_EMAIL = 'no-reply@' + BASE_URL DEFAULT_FROM_EMAIL = DEFAULT_EMAIL From a391cef9122d820f03a803669af41408e712154e Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 28 Jun 2020 14:34:17 -0400 Subject: [PATCH 02/11] put a email port in a docker container --- .env.example | 1 + docker-compose.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.env.example b/.env.example index 5d115fa4..2dda0aa7 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,7 @@ GMAIL_PASSWORD=YOUR_APP_PASSWORD DATABASE_NAME=murmur MYSQL_PASS=murmurdb DATABASE_HOST=db +GMAIL_PORT=587 # domain name used for sending emails DOMAIN_NAME=localhost:8000 diff --git a/docker-compose.yml b/docker-compose.yml index 937ee67b..68280ca2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,6 +27,7 @@ services: - DATABASE_HOST=${DATABASE_HOST} - GMAIL_USER=${GMAIL_USER} - GMAIL_PASSWORD=${GMAIL_PASSWORD} + - GMAIL_PORT=${GMAIL_PORT} restart: on-failure smtp: image: namshi/smtp From 0c3ad1547e9567404ae5a04a2a70aa7c1a472396 Mon Sep 17 00:00:00 2001 From: raxelg Date: Tue, 30 Jun 2020 16:39:53 -0400 Subject: [PATCH 03/11] Made changes for django upgrade --- browser/views.py | 2 + engine/main.py | 7 +-- gmail_setup/views.py | 2 +- http_handler/settings.py | 2 - registration/backends/default/views.py | 2 +- registration/forms.py | 2 +- registration/models.py | 4 +- schema/models.py | 68 +++++++++++++------------- 8 files changed, 45 insertions(+), 44 deletions(-) diff --git a/browser/views.py b/browser/views.py index d272a287..fee29eb4 100644 --- a/browser/views.py +++ b/browser/views.py @@ -940,6 +940,8 @@ def insert_reply(request): res = engine.main.insert_reply(group_name, 'Re: ' + orig_subject, msg_text, user, user.email, msg_id, True, forwarding_list=original_group_object, thread_id=thread_id) + print(res) + if(res['status']): to_send = res['recipients'] post_addr = '%s <%s>' %(group_name, group_name + '@' + HOST) diff --git a/engine/main.py b/engine/main.py index fef347bf..603f406f 100644 --- a/engine/main.py +++ b/engine/main.py @@ -1268,16 +1268,17 @@ def insert_reply(group_name, subject, message_text, user, sender_addr, msg_id, v #users following the tag follow_tag = FollowTag.objects.filter(group=group, tag__in=tag_objs).select_related() recipients.extend([f.user.email for f in follow_tag if f.user.email not in always_follow_members]) - #users that always follow threads in this group. minus those that muted recipients.extend([m.member.email for m in member_recip if m.member.email not in muted_emails]) - + dissimulate = DoNotSendList.objects.filter(group=group, user=group_members) # remove dissimulated user from the recipient list + print(tag_objs) if dissimulate.count() > 0: + print(tag_objs) for d in dissimulate: recipients = [recip for recip in recipients if recip != d.donotsend_user.email] - + print(tag_objs) res['status'] = True res['recipients'] = list(set(recipients)) res['tags'] = [] diff --git a/gmail_setup/views.py b/gmail_setup/views.py index 76ef05e9..73c9ee28 100644 --- a/gmail_setup/views.py +++ b/gmail_setup/views.py @@ -22,7 +22,7 @@ from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect from django.conf import settings from django.contrib.auth import get_user_model -from django.contrib.sites.models import get_current_site +from django.contrib.sites.shortcuts import get_current_site from django.core.urlresolvers import reverse from django.shortcuts import render, render_to_response from oauth2client import xsrfutil diff --git a/http_handler/settings.py b/http_handler/settings.py index 93394072..74649c08 100644 --- a/http_handler/settings.py +++ b/http_handler/settings.py @@ -182,8 +182,6 @@ def _get_website(): 'loaders': [ 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', - # 'django_mobile.loader.Loader', - # 'django.template.loaders.eggs.Loader', ] }, }, diff --git a/registration/backends/default/views.py b/registration/backends/default/views.py index f249f15d..48444ed4 100644 --- a/registration/backends/default/views.py +++ b/registration/backends/default/views.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.contrib.sites.models import RequestSite +from django.contrib.sites.requests import RequestSite from django.contrib.sites.models import Site from registration import signals diff --git a/registration/forms.py b/registration/forms.py index 1180852b..96933849 100644 --- a/registration/forms.py +++ b/registration/forms.py @@ -13,7 +13,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.forms import PasswordResetForm from django.contrib.auth.tokens import default_token_generator -from django.contrib.sites.models import get_current_site +from django.contrib.sites.shortcuts import get_current_site from django.template import loader from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_encode diff --git a/registration/models.py b/registration/models.py index 2e478859..ddda657a 100644 --- a/registration/models.py +++ b/registration/models.py @@ -194,7 +194,7 @@ class RegistrationProfile(models.Model): except Exception: from schema.models import UserProfile as User - user = models.ForeignKey(User, unique=True, verbose_name=_('user')) + user = models.ForeignKey(User, unique=True, verbose_name=_('user'), on_delete=models.CASCADE) activation_key = models.CharField(_('activation key'), max_length=40) objects = RegistrationManager() @@ -210,7 +210,7 @@ def get_user(self): User = get_user_model() except ImportError: from schema.models import UserProfile as User - self.user = models.ForeignKey(User, unique=True, verbose_name=_('user')) + self.user = models.ForeignKey(User, unique=True, verbose_name=_('user'), on_delete=models.CASCADE) return self.user diff --git a/schema/models.py b/schema/models.py index af139d58..9b5ba68c 100644 --- a/schema/models.py +++ b/schema/models.py @@ -10,15 +10,15 @@ class Post(models.Model): id = models.AutoField(primary_key=True) - author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user_authored_posts', null=True) + author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user_authored_posts', null=True, on_delete=models.CASCADE) subject = models.TextField() msg_id = models.CharField(max_length=120, unique=True) post = models.TextField() - group = models.ForeignKey('Group') - thread = models.ForeignKey('Thread') - reply_to = models.ForeignKey('self', blank=False, null=True, related_name="replies") + group = models.ForeignKey('Group', on_delete=models.CASCADE) + thread = models.ForeignKey('Thread', on_delete=models.CASCADE) + reply_to = models.ForeignKey('self', blank=False, null=True, related_name="replies", on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) - forwarding_list = models.ForeignKey('ForwardingList', null=True) + forwarding_list = models.ForeignKey('ForwardingList', null=True, on_delete=models.CASCADE) verified_sender = models.BooleanField(default=False) # a post's author is the Murmur user (if any) who wrote the post. # a post's poster_email is the email address of the user who originally @@ -41,7 +41,7 @@ class Post(models.Model): mod_explanation = models.TextField(null=True) # who the moderator that approved or rejected this message was - who_moderated = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user_moderated_posts', null=True) + who_moderated = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user_moderated_posts', null=True, on_delete=models.CASCADE) perspective_data = JSONField(null=True) @@ -70,7 +70,7 @@ class Thread(models.Model): id = models.AutoField(primary_key=True) subject = models.TextField() timestamp = models.DateTimeField(auto_now=True) - group = models.ForeignKey('Group') + group = models.ForeignKey('Group', on_delete=models.CASCADE) def __unicode__(self): return '%s in %s' % (self.id, self.group) @@ -81,9 +81,9 @@ class Meta: class DoNotSendList(models.Model): id = models.AutoField(primary_key=True) - group = models.ForeignKey('Group') - user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=False, related_name='donotsend_author') - donotsend_user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=False, related_name='donotsend_user') + group = models.ForeignKey('Group', on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=False, related_name='donotsend_author', on_delete=models.CASCADE) + donotsend_user = models.ForeignKey(settings.AUTH_USER_MODEL, unique=False, related_name='donotsend_user', on_delete=models.CASCADE) def __unicode__(self): return '%s dissimulate user for user %s at group %s' % (self.user.name, self.donotsend_user.name, self.group) @@ -93,8 +93,8 @@ class Meta: # unique_together = ("user", "group", "donotsend_user") class TagThread(models.Model): - thread = models.ForeignKey('Thread') - tag = models.ForeignKey('Tag') + thread = models.ForeignKey('Thread', on_delete=models.CASCADE) + tag = models.ForeignKey('Tag', on_delete=models.CASCADE) def __unicode__(self): return '%s tag for Thread %s' % (self.tag.name, self.thread.id) @@ -108,7 +108,7 @@ class Meta: moderation. ''' class ThreadHash(models.Model): - group = models.ForeignKey('Group') + group = models.ForeignKey('Group', on_delete=models.CASCADE) # we store a hash so that we don't keep information about # this thread once all its posts are approved. @@ -122,7 +122,7 @@ class ThreadHash(models.Model): class Tag(models.Model): id = models.AutoField(primary_key=True) - group = models.ForeignKey('Group') + group = models.ForeignKey('Group', on_delete=models.CASCADE) color = models.CharField(max_length=6) name = models.CharField(max_length=20) @@ -134,9 +134,9 @@ class Meta: class FollowTag(models.Model): id = models.AutoField(primary_key=True) - user = models.ForeignKey(settings.AUTH_USER_MODEL) - group = models.ForeignKey('Group') - tag = models.ForeignKey('Tag') + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + group = models.ForeignKey('Group', on_delete=models.CASCADE) + tag = models.ForeignKey('Tag', on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) def __unicode__(self): @@ -147,9 +147,9 @@ class Meta: class MuteTag(models.Model): id = models.AutoField(primary_key=True) - user = models.ForeignKey(settings.AUTH_USER_MODEL) - group = models.ForeignKey('Group') - tag = models.ForeignKey('Tag') + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + group = models.ForeignKey('Group', on_delete=models.CASCADE) + tag = models.ForeignKey('Tag', on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) def __unicode__(self): @@ -161,8 +161,8 @@ class Meta: class MemberGroup(models.Model): id = models.AutoField(primary_key=True) - member = models.ForeignKey(settings.AUTH_USER_MODEL) - group = models.ForeignKey('Group') + member = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + group = models.ForeignKey('Group', on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) admin = models.BooleanField(default=False) moderator = models.BooleanField(default=False) @@ -184,8 +184,8 @@ class Meta: class MemberGroupPending(models.Model): id = models.AutoField(primary_key=True) - member = models.ForeignKey(settings.AUTH_USER_MODEL) - group = models.ForeignKey('Group') + member = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + group = models.ForeignKey('Group', on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) hash = models.CharField(max_length=40) @@ -200,7 +200,7 @@ class ForwardingList(models.Model): id = models.AutoField(primary_key=True) email = models.EmailField(verbose_name='email address',max_length=100) timestamp = models.DateTimeField(auto_now=True) - group = models.ForeignKey('Group') + group = models.ForeignKey('Group', on_delete=models.CASCADE) url = models.URLField(null=True, blank=True) can_post = models.BooleanField(default=False) can_receive = models.BooleanField(default=False) @@ -235,7 +235,7 @@ class Meta: class WhiteOrBlacklist(models.Model): id = models.AutoField(primary_key=True) - group = models.ForeignKey('Group') + group = models.ForeignKey('Group', on_delete=models.CASCADE) email = models.EmailField(max_length=100) # only one of the following can be true @@ -321,8 +321,8 @@ def is_staff(self): class Following(models.Model): id = models.AutoField(primary_key=True) - thread = models.ForeignKey('Thread') - user = models.ForeignKey(settings.AUTH_USER_MODEL) + thread = models.ForeignKey('Thread', on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) def __unicode__(self): @@ -334,8 +334,8 @@ class Meta: class Mute(models.Model): id = models.AutoField(primary_key=True) - thread = models.ForeignKey('Thread') - user = models.ForeignKey(settings.AUTH_USER_MODEL) + thread = models.ForeignKey('Thread', on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) dissimulated = models.BooleanField(default=False) @@ -347,8 +347,8 @@ class Meta: class Upvote(models.Model): id = models.AutoField(primary_key=True) - post = models.ForeignKey('Post') - user = models.ForeignKey(settings.AUTH_USER_MODEL) + post = models.ForeignKey('Post', on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) timestamp = models.DateTimeField(auto_now=True) def __unicode__(self): @@ -358,10 +358,10 @@ class Meta: db_table = "murmur_likes" class FlowModel(models.Model): - id = models.ForeignKey(AUTH_USER_MODEL, primary_key=True) + id = models.ForeignKey(AUTH_USER_MODEL, primary_key=True, on_delete=models.CASCADE) flow = FlowField() class CredentialsModel(models.Model): - id = models.ForeignKey(AUTH_USER_MODEL, primary_key=True) + id = models.ForeignKey(AUTH_USER_MODEL, primary_key=True, on_delete=models.CASCADE) credential = CredentialsField() \ No newline at end of file From bba8e8f8a0e32cd8af68891ae81a8edfa15806ae Mon Sep 17 00:00:00 2001 From: Raxel Gutierrez <39710446+raxelg@users.noreply.github.com> Date: Tue, 30 Jun 2020 17:09:44 -0400 Subject: [PATCH 04/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d58f7212..bc60980e 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Next set up the environment variables. The only variables you should need to set 1. `cp .env.example .env` 2. Fill in the correct values in `.env` for your gmail account. Make sure to enable insecure logins on gmail. 3. Use `make` to create the database and create a superuser account to login -4. Check it out on `localhost:8000 +4. Check it out on `localhost:8000` #### Starting and Stopping Docker From 17bac6214e4a2a938c2316d6712f0d9a65476b79 Mon Sep 17 00:00:00 2001 From: Raxel Gutierrez Date: Tue, 7 Jul 2020 14:46:18 -0400 Subject: [PATCH 05/11] Upgraded to django 1.10 successfully --- browser/templates/murmur/about.html | 17 +- browser/templates/murmur/group_page.html | 123 +++++++-------- browser/templates/murmur/home.html | 12 -- browser/templates/squadbox/group_page.html | 26 +-- browser/views.py | 87 +++++----- gmail_setup/api.py | 2 +- gmail_setup/views.py | 8 +- http_handler/settings.py | 23 +-- http_handler/urls.py | 175 +++++++++++---------- registration/tests/default_backend.py | 2 +- registration/tests/simple_backend.py | 4 +- requirements.txt | 7 +- schema/models.py | 2 +- smtp_handler/utils.py | 2 +- 14 files changed, 210 insertions(+), 280 deletions(-) diff --git a/browser/templates/murmur/about.html b/browser/templates/murmur/about.html index 6a178285..d4c36620 100644 --- a/browser/templates/murmur/about.html +++ b/browser/templates/murmur/about.html @@ -14,18 +14,8 @@ {% block content %} -{% if flavour != "mobile" %}
-{% else %} -
-{% endif %} -{% if flavour != "mobile" %}
- {% else %} -
- {% endif %} - -

We're re-imagining mailing lists and community discourse for the age of social media.

Murmur is a new tool for group communication that blends concepts from mailing lists, forums, and social media. @@ -63,13 +53,8 @@

Code

-{% if flavour != "mobile" %}
- {% else %} -
- {% endif %} - - +

Our Research Team


diff --git a/browser/templates/murmur/group_page.html b/browser/templates/murmur/group_page.html index 0968b035..36589b7c 100644 --- a/browser/templates/murmur/group_page.html +++ b/browser/templates/murmur/group_page.html @@ -106,11 +106,9 @@

Members List

Select Email - {% if flavour != "mobile" %} - Joined - Admin - Moderator - {% endif %} + Joined + Admin + Moderator @@ -118,11 +116,9 @@

Members List

Select Email - {% if flavour != "mobile" %} - Joined - Admin - Moderator - {% endif %} + Joined + Admin + Moderator @@ -138,23 +134,6 @@

Members List

{% if group_info.admin %} {{ member.email }} - {% if flavour != "mobile" %} - {{ member.joined }} - {% if member.admin %} - - {% else %} - - {% endif %} - {% if member.mod %} - - {% else %} - - {% endif %} - {% endif %} - - {% else %} - {{ member.email }} - {% if flavour != "mobile" %} {{ member.joined }} {% if member.admin %} @@ -166,6 +145,19 @@

Members List

{% else %} {% endif %} + + {% else %} + {{ member.email }} + {{ member.joined }} + {% if member.admin %} + + {% else %} + + {% endif %} + {% if member.mod %} + + {% else %} + {% endif %} {% endif %} @@ -174,18 +166,16 @@

Members List

{{ member.email }} (pending) - {% if flavour != "mobile" %} - {{ member.joined }} - {% if member.admin %} - - {% else %} - - {% endif %} - {% if member.mod %} - - {% else %} - - {% endif %} + {{ member.joined }} + {% if member.admin %} + + {% else %} + + {% endif %} + {% if member.mod %} + + {% else %} + {% endif %} {% endfor %} @@ -210,11 +200,10 @@

Associated Mailing Lists

Select Email - {% if flavour != "mobile" %} - Added - Can Post - Can Receive - List URL + Added + Can Post + Can Receive + List URL @@ -222,11 +211,10 @@

Associated Mailing Lists

Select Email - {% if flavour != "mobile" %} - Added - Can Post - Can Receive - List URL + Added + Can Post + Can Receive + List URL {% endif %} @@ -237,26 +225,25 @@

Associated Mailing Lists

{{ l.email }} - {% if flavour != "mobile" %} - {{ l.added }} - - {% if l.can_post %} - - {% endif %} - - - {% if l.can_receive %} - - {% endif %} - - - - {% if l.url != None %} - {{ l.url }} - {% endif %} - + + {{ l.added }} + + {% if l.can_post %} + + {% endif %} + + + {% if l.can_receive %} + + {% endif %} + + + + {% if l.url != None %} + {{ l.url }} + {% endif %} + - {% endif %} {% endfor %} diff --git a/browser/templates/murmur/home.html b/browser/templates/murmur/home.html index f5a48f7a..a15a7c21 100644 --- a/browser/templates/murmur/home.html +++ b/browser/templates/murmur/home.html @@ -14,17 +14,9 @@ {% block content %} -{% if flavour != "mobile" %}
-{% else %} -
-{% endif %} -{% if flavour != "mobile" %}
- {% else %} -
- {% endif %}

Welcome to Murmur.

@@ -53,11 +45,7 @@
We're re-imagining mailing lists and community discourse for the age of soci Explore All Public Groups
-{% if flavour != "mobile" %}
- {% else %} -
- {% endif %}
{% csrf_token %} diff --git a/browser/templates/squadbox/group_page.html b/browser/templates/squadbox/group_page.html index e175faf9..7fcaa218 100644 --- a/browser/templates/squadbox/group_page.html +++ b/browser/templates/squadbox/group_page.html @@ -99,9 +99,7 @@

Squad Moderators

Select Email - {% if flavour != "mobile" %} - Joined - {% endif %} + Joined @@ -111,9 +109,7 @@

Squad Moderators

{{ member.email }} - {% if flavour != "mobile" %} {{ member.joined }} - {% endif %} {% endif %} {% endfor %} @@ -121,9 +117,7 @@

Squad Moderators

{{ member.email }} (pending) - {% if flavour != "mobile" %} - {{ member.joined }} - {% endif %} + {{ member.joined }} {% endfor %} @@ -143,9 +137,7 @@

Whitelist

Select {% endif %} Email - {% if flavour != "mobile" %} - Added - {% endif %} + Added @@ -156,9 +148,7 @@

Whitelist

{% endif %} {{ w.email }} - {% if flavour != "mobile" %} - {{ w.timestamp }} - {% endif %} + {{ w.timestamp }} {% endfor %} @@ -177,9 +167,7 @@

Blacklist

Select Email - {% if flavour != "mobile" %} - Added - {% endif %} + Added @@ -188,9 +176,7 @@

Blacklist

{{ b.email }} - {% if flavour != "mobile" %} - {{ b.timestamp }} - {% endif %} + {{ b.timestamp }} {% endfor %} diff --git a/browser/views.py b/browser/views.py index fee29eb4..2ec9f4c3 100644 --- a/browser/views.py +++ b/browser/views.py @@ -52,7 +52,7 @@ def about(request): @render_to('404.html') def error(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") groups_links = get_groups_links_from_roles(user, groups) @@ -82,7 +82,7 @@ def error(request): def index(request): homepage = "%s/home.html" % WEBSITE - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return render(request, homepage, {'form': AuthenticationForm(), @@ -97,7 +97,7 @@ def index(request): def post_list(request): tag_info = None - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -178,7 +178,7 @@ def thread(request): group = thread.group - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") groups_links = get_groups_links_from_roles(user, groups) @@ -237,7 +237,7 @@ def rejected_thread(request): group = thread.group - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) mg = MemberGroup.objects.filter(member=user, group=group) if mg.exists() and (mg[0].admin or mg[0].moderator): @@ -273,15 +273,9 @@ def settings(request): @render_to(WEBSITE+"/groups.html") @login_required def my_groups(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) return HttpResponseRedirect('/my_group_list') - # if request.flavour == "mobile": - # return HttpResponseRedirect('/my_group_list') - # else: - # groups = Group.objects.filter(membergroup__member=user).values("name") - # info = engine.main.check_admin(user,groups) - # return {'user': request.user, 'groups': groups, 'group_page': True, 'my_groups': True, 'info':info} else: return HttpResponseRedirect(global_settings.LOGIN_URL) @@ -333,10 +327,7 @@ def group_list(request): user = None groups = [] pub_groups = engine.main.list_groups(user) - if request.flavour == "mobile": - return HttpResponseRedirect('/pub_group_list') - else: - return {'user': request.user, 'groups': groups, 'pub_groups': pub_groups, 'group_page': True} + return {'user': request.user, 'groups': groups, 'pub_groups': pub_groups, 'group_page': True} @render_to(WEBSITE+"/login_email.html") @login_required @@ -456,7 +447,7 @@ def my_group_settings_view(request, group_name): @render_to(WEBSITE+"/create_post.html") @login_required def my_group_create_post_view(request, group_name): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") try: @@ -710,7 +701,7 @@ def adjust_list_can_receive(request): def subscribe_group(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.subscribe_group(request.POST['group_name'], user) @@ -780,7 +771,7 @@ def list_posts(request): def refresh_posts(request): try: group_name = request.POST.get('active_group') - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) else: user = None @@ -1029,7 +1020,7 @@ def insert_reply(request): @render_to(WEBSITE+"/follow_tag.html") @login_required def follow_tag_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1046,7 +1037,7 @@ def follow_tag_get(request): @render_to(WEBSITE+"/follow_tag.html") @login_required def unfollow_tag_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1063,7 +1054,7 @@ def unfollow_tag_get(request): @render_to(WEBSITE+"/follow_tag.html") @login_required def mute_tag_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1080,7 +1071,7 @@ def mute_tag_get(request): @render_to(WEBSITE+"/follow_tag.html") @login_required def unmute_tag_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1099,7 +1090,7 @@ def unmute_tag_get(request): @render_to(WEBSITE+"/follow_thread.html") @login_required def follow_thread_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1114,7 +1105,7 @@ def follow_thread_get(request): @render_to(WEBSITE+"/follow_thread.html") @login_required def unfollow_thread_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1129,7 +1120,7 @@ def unfollow_thread_get(request): @render_to(WEBSITE+"/follow_thread.html") @login_required def mute_thread_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1144,7 +1135,7 @@ def mute_thread_get(request): @render_to(WEBSITE+"/follow_thread.html") @login_required def unmute_thread_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1185,7 +1176,7 @@ def unupvote(request): def unsubscribe_get(request): group_name = request.GET.get('group_name') - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return redirect(global_settings.LOGIN_URL + '?next=/unsubscribe_get?group_name=' + group_name) if WEBSITE == 'murmur': @@ -1222,7 +1213,7 @@ def subscribe_get(request): group_name = request.GET.get('group_name') email_param = request.GET.get('email') - if not request.user.is_authenticated() and not email_param: + if not request.user.is_authenticated and not email_param: return redirect(global_settings.LOGIN_URL + '?next=/subscribe_get?group_name=' + group_name) if WEBSITE == 'murmur': @@ -1242,7 +1233,7 @@ def subscribe_get(request): if not g.public: return redirect('/404?e=perm') - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.subscribe_group(group_name, user) @@ -1277,7 +1268,7 @@ def subscribe_get(request): @render_to(WEBSITE+"/upvote.html") @login_required def upvote_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") post_id = request.GET.get('post_id') @@ -1291,7 +1282,7 @@ def upvote_get(request): @render_to(WEBSITE+"/upvote.html") @login_required def unupvote_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") @@ -1306,7 +1297,7 @@ def unupvote_get(request): @render_to("whitelist.html") @login_required def blacklist_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") group_name = request.GET.get('group_name') @@ -1321,7 +1312,7 @@ def blacklist_get(request): @render_to("whitelist.html") @login_required def whitelist_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) groups = Group.objects.filter(membergroup__member=user).values("name") group_name = request.GET.get('group_name') @@ -1407,7 +1398,7 @@ def unblacklist_unwhitelist(request): @render_to("approve_reject.html") @login_required def approve_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) group_name = request.GET.get('group_name') post_id = request.GET.get('post_id') @@ -1422,7 +1413,7 @@ def approve_get(request): @render_to("approve_reject.html") @login_required def reject_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) group_name = request.GET.get('group_name') post_id = request.GET.get('post_id') @@ -1437,7 +1428,7 @@ def reject_get(request): @login_required def approve_post(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) group_name = request.POST['group_name'] post_id = request.POST['post_id'] @@ -1451,7 +1442,7 @@ def approve_post(request): @login_required def reject_post(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) group_name = request.POST['group_name'] post_id = request.POST['post_id'] @@ -1494,7 +1485,7 @@ def delete_posts(request): @login_required def follow_thread(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.follow_thread(request.POST['thread_id'], user=user) return HttpResponse(json.dumps(res), content_type="application/json") @@ -1521,7 +1512,7 @@ def unfollow_thread(request): @login_required def follow_tag(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.follow_tag(request.POST['tag_name'], request.POST['group_name'], user=user) return HttpResponse(json.dumps(res), content_type="application/json") @@ -1533,7 +1524,7 @@ def follow_tag(request): @login_required def unfollow_tag(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.unfollow_tag(request.POST['tag_name'], request.POST['group_name'], user=user) return HttpResponse(json.dumps(res), content_type="application/json") @@ -1545,7 +1536,7 @@ def unfollow_tag(request): @login_required def mute_tag(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.mute_tag(request.POST['tag_name'], request.POST['group_name'], user=user) return HttpResponse(json.dumps(res), content_type="application/json") @@ -1557,7 +1548,7 @@ def mute_tag(request): @login_required def unmute_tag(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.unmute_tag(request.POST['tag_name'], request.POST['group_name'], user=user) return HttpResponse(json.dumps(res), content_type="application/json") @@ -1569,7 +1560,7 @@ def unmute_tag(request): @login_required def mute_thread(request): try: - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.mute_thread(request.POST['thread_id'], user=user) return HttpResponse(json.dumps(res), content_type="application/json") @@ -1606,7 +1597,7 @@ def murmur_acct(request, acct_func=None, template_name=None): @login_required def serve_attachment(request, hash_filename): - if request.user.is_authenticated(): + if request.user.is_authenticated: try: user = get_object_or_404(UserProfile, email=request.user.email) attachment = Attachment.objects.get(hash_filename=hash_filename) @@ -1637,7 +1628,7 @@ def serve_attachment(request, hash_filename): @render_to('squadbox/mod_queue.html') def mod_queue(request, group_name): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) mgs = MemberGroup.objects.filter(member=user, group__name=group_name) @@ -1678,7 +1669,7 @@ def subscribe_confirm(request, token): @render_to('squadbox/rejected.html') def rejected(request, group_name): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) res = engine.main.load_rejected_posts(user, group_name) if not res['status']: @@ -1694,7 +1685,7 @@ def rejected(request, group_name): @render_to("squadbox/moderate_user_thread.html") @login_required def moderate_user_for_thread_get(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: user = get_object_or_404(UserProfile, email=request.user.email) group_name = request.GET.get('group_name') subject = request.GET.get('subject') diff --git a/gmail_setup/api.py b/gmail_setup/api.py index ec34b93f..d67fee5b 100644 --- a/gmail_setup/api.py +++ b/gmail_setup/api.py @@ -1,6 +1,6 @@ from apiclient.discovery import build import httplib2, logging, re, time -from oauth2client.django_orm import Storage +from oauth2client.contrib.django_orm import Storage from http_handler.settings import BASE_URL from schema.models import CredentialsModel diff --git a/gmail_setup/views.py b/gmail_setup/views.py index 73c9ee28..1b997150 100644 --- a/gmail_setup/views.py +++ b/gmail_setup/views.py @@ -23,11 +23,11 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.sites.shortcuts import get_current_site -from django.core.urlresolvers import reverse -from django.shortcuts import render, render_to_response -from oauth2client import xsrfutil +from django.urls import reverse +from django.shortcuts import render +from oauth2client.contrib import xsrfutil from oauth2client.client import flow_from_clientsecrets -from oauth2client.django_orm import Storage +from oauth2client.contrib.django_orm import Storage CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json') diff --git a/http_handler/settings.py b/http_handler/settings.py index ab003de1..5f4af261 100644 --- a/http_handler/settings.py +++ b/http_handler/settings.py @@ -177,9 +177,6 @@ def _get_website(): # Don't forget to use absolute paths, not relative paths. ], 'OPTIONS': { - 'context_processors': [ - 'django_mobile.context_processors.flavour', - ], # List of callables that know how to import templates from various sources. 'loaders': [ 'django.template.loaders.filesystem.Loader', @@ -189,20 +186,17 @@ def _get_website(): }, ] -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', +TEMPLATE_LOADERS = TEMPLATES[0]['OPTIONS']['loaders'] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', - # Uncomment the next line for simple clickjacking protection: - # 'django.middleware.clickjacking.XFrameOptionsMiddleware', - - 'django_mobile.middleware.MobileDetectionMiddleware', - 'django_mobile.middleware.SetFlavourMiddleware', - -) + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] ROOT_URLCONF = 'http_handler.urls' @@ -237,8 +231,7 @@ def _get_website(): #third party apps 'registration', - 'django_mobile', - 'storages' + 'storages', ) # A sample logging configuration. The only tangible logging diff --git a/http_handler/urls.py b/http_handler/urls.py index 29ed32ca..62218917 100644 --- a/http_handler/urls.py +++ b/http_handler/urls.py @@ -2,6 +2,7 @@ from django.contrib.auth import views as auth_views from django.views.generic.base import TemplateView from browser.views import * +from browser import views from http_handler.settings import WEBSITE from registration.backends.default.views import ActivationView from registration.forms import MurmurPasswordResetForm @@ -13,34 +14,34 @@ #shared URL patterns urlpatterns = [ - url(r'^$', 'browser.views.index'), - url(r'^lamson_status', 'browser.views.lamson_status'), - url(r'^settings', 'browser.views.settings'), - url(r'^404', 'browser.views.error'), + url(r'^$', views.index), + url(r'^lamson_status', views.lamson_status), + url(r'^settings', views.settings), + url(r'^404', views.error), - url(r'^thread$', 'browser.views.thread'), + url(r'^thread$', views.thread), - url(r'^create_new_group', 'browser.views.create_group_view'), - url(r'^create_group', 'browser.views.create_group'), - url(r'^delete_group', 'browser.views.delete_group'), + url(r'^create_new_group', views.create_group_view), + url(r'^create_group', views.create_group), + url(r'^delete_group', views.delete_group), - url(r'^groups/(?P[\w-]+)/edit_group_info', 'browser.views.edit_group_info_view'), - url(r'^edit_group_info', 'browser.views.edit_group_info'), - url(r'^group_info', 'browser.views.group_info'), - url(r'^groups/(?P[\w-]+)$', 'browser.views.group_page'), + url(r'^groups/(?P[\w-]+)/edit_group_info', views.edit_group_info_view), + url(r'^edit_group_info', views.edit_group_info), + url(r'^group_info', views.group_info), + url(r'^groups/(?P[\w-]+)$', views.group_page), - url(r'^groups/(?P[\w-]+)/add_members', 'browser.views.add_members_view'), - url(r'^add_members', 'browser.views.add_members'), - url(r'^edit_members', 'browser.views.edit_members'), + url(r'^groups/(?P[\w-]+)/add_members', views.add_members_view), + url(r'^add_members', views.add_members), + url(r'^edit_members', views.edit_members), - url(r'^unsubscribe_group', 'browser.views.unsubscribe_group'), - url(r'^subscribe_group', 'browser.views.subscribe_group'), + url(r'^unsubscribe_group', views.unsubscribe_group), + url(r'^subscribe_group', views.subscribe_group), - url(r'^my_group_list', 'browser.views.my_group_list'), + url(r'^my_group_list', views.my_group_list), - url(r'^edit_group_settings', 'browser.views.edit_group_settings'), - url(r'^group_settings', 'browser.views.get_group_settings'), - url(r'^groups/(?P[\w-]+)/edit_my_settings', 'browser.views.my_group_settings_view'), + url(r'^edit_group_settings', views.edit_group_settings), + url(r'^group_settings', views.get_group_settings), + url(r'^groups/(?P[\w-]+)/edit_my_settings', views.my_group_settings_view), url(r'^gmail_setup/', include('gmail_setup.urls', namespace="oauth2")), @@ -73,7 +74,7 @@ {'extra_context' : website_context}, name='password_reset_confirm'), - url(r'^attachment/(?P[0-9A-Za-z_]+)', 'browser.views.serve_attachment'), + url(r'^attachment/(?P[0-9A-Za-z_]+)', views.serve_attachment), url(r'^accounts/activate/complete/$', TemplateView.as_view(template_name='registration/activation_complete.html'), @@ -94,79 +95,79 @@ url(r'^accounts/', include('registration.backends.default.urls')), - url(r'^subscribe/confirm/(?P.+)$', 'browser.views.subscribe_confirm'), + url(r'^subscribe/confirm/(?P.+)$', views.subscribe_confirm), - url(r'^activate_group', 'browser.views.activate_group'), - url(r'^deactivate_group', 'browser.views.deactivate_group'), + url(r'^activate_group', views.activate_group), + url(r'^deactivate_group', views.deactivate_group), ] # murmur-only patterns if WEBSITE == 'murmur': new_patterns = [ - url(r'^about', 'browser.views.about'), - url(r'^posts$', 'browser.views.post_list'), + url(r'^about', views.about), + url(r'^posts$', views.post_list), - url(r'^unsubscribe_get', 'browser.views.unsubscribe_get'), - url(r'^subscribe_get', 'browser.views.subscribe_get'), + url(r'^unsubscribe_get', views.unsubscribe_get), + url(r'^subscribe_get', views.subscribe_get), - url(r'^post_list', 'browser.views.post_list'), - url(r'^pub_group_list', 'browser.views.pub_group_list'), - url(r'^group_list', 'browser.views.group_list'), - url(r'^groups/(?P[\w-]+)/add_list', 'browser.views.add_list_view'), - url(r'^groups/(?P[\w-]+)/create_post', 'browser.views.my_group_create_post_view'), - url(r'^my_groups', 'browser.views.my_groups'), - url(r'^list_my_groups', 'browser.views.list_my_groups'), + url(r'^post_list', views.post_list), + url(r'^pub_group_list', views.pub_group_list), + url(r'^group_list', views.group_list), + url(r'^groups/(?P[\w-]+)/add_list', views.add_list_view), + url(r'^groups/(?P[\w-]+)/create_post', views.my_group_create_post_view), + url(r'^my_groups', views.my_groups), + url(r'^list_my_groups', views.list_my_groups), - url(r'^load_post', 'browser.views.load_post'), - url(r'^load_thread', 'browser.views.load_thread'), + url(r'^load_post', views.load_post), + url(r'^load_thread', views.load_thread), - url(r'^list_posts', 'browser.views.list_posts'), - url(r'^refresh_posts', 'browser.views.refresh_posts'), + url(r'^list_posts', views.list_posts), + url(r'^refresh_posts', views.refresh_posts), - url(r'^insert_post', 'browser.views.insert_post'), - url(r'^insert_reply', 'browser.views.insert_reply'), + url(r'^insert_post', views.insert_post), + url(r'^insert_reply', views.insert_reply), - url(r'^upvote_get', 'browser.views.upvote_get'), - url(r'^unupvote_get', 'browser.views.unupvote_get'), + url(r'^upvote_get', views.upvote_get), + url(r'^unupvote_get', views.unupvote_get), - url(r'^upvote', 'browser.views.upvote'), - url(r'^unupvote', 'browser.views.unupvote'), + url(r'^upvote', views.upvote), + url(r'^unupvote', views.unupvote), - url(r'^follow_tag_get', 'browser.views.follow_tag_get'), - url(r'^unfollow_tag_get', 'browser.views.unfollow_tag_get'), + url(r'^follow_tag_get', views.follow_tag_get), + url(r'^unfollow_tag_get', views.unfollow_tag_get), - url(r'^mute_tag_get', 'browser.views.mute_tag_get'), - url(r'^unmute_tag_get', 'browser.views.unmute_tag_get'), + url(r'^mute_tag_get', views.mute_tag_get), + url(r'^unmute_tag_get', views.unmute_tag_get), - url(r'^follow_tag', 'browser.views.follow_tag'), - url(r'^unfollow_tag', 'browser.views.unfollow_tag'), + url(r'^follow_tag', views.follow_tag), + url(r'^unfollow_tag', views.unfollow_tag), - url(r'^mute_tag', 'browser.views.mute_tag'), - url(r'^unmute_tag', 'browser.views.unmute_tag'), + url(r'^mute_tag', views.mute_tag), + url(r'^unmute_tag', views.unmute_tag), - url(r'^follow_thread', 'browser.views.follow_thread'), - url(r'^unfollow_thread', 'browser.views.unfollow_thread'), + url(r'^follow_thread', views.follow_thread), + url(r'^unfollow_thread', views.unfollow_thread), - url(r'^mute_thread', 'browser.views.mute_thread'), - url(r'^unmute_thread', 'browser.views.unmute_thread'), + url(r'^mute_thread', views.mute_thread), + url(r'^unmute_thread', views.unmute_thread), - url(r'^follow', 'browser.views.follow_thread_get'), - url(r'^unfollow', 'browser.views.unfollow_thread_get'), + url(r'^follow', views.follow_thread_get), + url(r'^unfollow', views.unfollow_thread_get), - url(r'^mute', 'browser.views.mute_thread_get'), - url(r'^unmute', 'browser.views.unmute_thread_get'), + url(r'^mute', views.mute_thread_get), + url(r'^unmute', views.unmute_thread_get), - url(r'^add_list', 'browser.views.add_list'), - url(r'^delete_list', 'browser.views.delete_list'), + url(r'^add_list', views.add_list), + url(r'^delete_list', views.delete_list), - url(r'^adjust_list_can_post', 'browser.views.adjust_list_can_post'), - url(r'^adjust_list_can_receive', 'browser.views.adjust_list_can_receive'), - - url(r'^login_email', 'browser.views.login_imap_view'), - url(r'^login_imap', 'browser.views.login_imap'), - url(r'^groups/(?P[\w-]+)/add_donotsend', 'browser.views.add_dissimulate_view'), - url(r'^edit_donotsend', 'browser.views.edit_donotsend'), - url(r'^donotsend_list', 'browser.views.donotsend_list'), + url(r'^adjust_list_can_post', views.adjust_list_can_post), + url(r'^adjust_list_can_receive', views.adjust_list_can_receive), + + url(r'^login_email', views.login_imap_view), + url(r'^login_imap', views.login_imap), + url(r'^groups/(?P[\w-]+)/add_donotsend', views.add_dissimulate_view), + url(r'^edit_donotsend', views.edit_donotsend), + url(r'^donotsend_list', views.donotsend_list), ] urlpatterns.extend(new_patterns) @@ -175,31 +176,31 @@ elif WEBSITE == 'squadbox': new_patterns = [ - url(r'^mod_queue/(?P[\w-]+)', 'browser.views.mod_queue'), + url(r'^mod_queue/(?P[\w-]+)', views.mod_queue), # url(r'^approve_get', 'browser.views.approve_get'), # url(r'^reject_get', 'browser.views.reject_get'), - url(r'^approve_post', 'browser.views.approve_post'), - url(r'^reject_post', 'browser.views.reject_post'), + url(r'^approve_post', views.approve_post), + url(r'^reject_post', views.reject_post), - url(r'^delete_posts', 'browser.views.delete_posts'), - url(r'^delete_post', 'browser.views.delete_post'), + url(r'^delete_posts', views.delete_posts), + url(r'^delete_post', views.delete_post), - url(r'^whitelist_get', 'browser.views.whitelist_get'), - url(r'^whitelist', 'browser.views.whitelist'), - url(r'^groups/(?P[\w-]+)/add_whitelist', 'browser.views.add_whitelist_view'), + url(r'^whitelist_get', views.whitelist_get), + url(r'^whitelist', views.whitelist), + url(r'^groups/(?P[\w-]+)/add_whitelist', views.add_whitelist_view), - url(r'^unblacklist_unwhitelist', 'browser.views.unblacklist_unwhitelist'), + url(r'^unblacklist_unwhitelist', views.unblacklist_unwhitelist), - url(r'^blacklist_get', 'browser.views.blacklist_get'), - url(r'^blacklist', 'browser.views.blacklist'), - url(r'^groups/(?P[\w-]+)/add_blacklist', 'browser.views.add_blacklist_view'), + url(r'^blacklist_get', views.blacklist_get), + url(r'^blacklist', views.blacklist), + url(r'^groups/(?P[\w-]+)/add_blacklist', views.add_blacklist_view), - url(r'^groups/(?P[\w-]+)/rejected', 'browser.views.rejected'), - url(r'^rejected_thread$', 'browser.views.rejected_thread'), + url(r'^groups/(?P[\w-]+)/rejected', views.rejected), + url(r'^rejected_thread$', views.rejected_thread), - url(r'^moderate_user_for_thread_get', 'browser.views.moderate_user_for_thread_get'), + url(r'^moderate_user_for_thread_get', views.moderate_user_for_thread_get), ] urlpatterns.extend(new_patterns) diff --git a/registration/tests/default_backend.py b/registration/tests/default_backend.py index cdf1b0ad..7fea1be0 100644 --- a/registration/tests/default_backend.py +++ b/registration/tests/default_backend.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.core import mail -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import TestCase from registration import signals diff --git a/registration/tests/simple_backend.py b/registration/tests/simple_backend.py index fe61079f..f49c6bbd 100644 --- a/registration/tests/simple_backend.py +++ b/registration/tests/simple_backend.py @@ -1,6 +1,6 @@ from django.conf import settings from django.contrib.auth.models import User -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import TestCase from registration.forms import RegistrationForm @@ -73,7 +73,7 @@ def test_registration(self): # New user must be logged in. resp = self.client.get(reverse('registration_register')) - self.failUnless(resp.context['user'].is_authenticated()) + self.failUnless(resp.context['user'].is_authenticated) def test_registration_failure(self): """ diff --git a/requirements.txt b/requirements.txt index f3449945..9ab68e36 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,13 @@ -Django==1.8 +Django==1.10 Jinja2==2.10.3 MarkupSafe==0.23 mysqlclient==1.4.6 bleach==1.4 chardet==2.3.0 -django-annoying==0.8.0 +django-annoying==0.10.4 django-appconf==0.6 django-compressor==1.4 django-gravatar==0.1.0 -django-mobile==0.4.0 django-registration==2.0 html2text==2014.9.25 html5lib==1.0b3 @@ -23,7 +22,7 @@ python-modargs==1.7 six==1.8.0 wsgiref==0.1.2 pytz==2016.7 -oauth2client==1.5.2 +oauth2client==2.2.0 python-gflags==3.1.0 google-api-python-client==1.6.1 python-gnupg==0.4.0 diff --git a/schema/models.py b/schema/models.py index 9b5ba68c..44550d0e 100644 --- a/schema/models.py +++ b/schema/models.py @@ -3,7 +3,7 @@ from django.db import models from django.utils.http import urlquote from jsonfield import JSONField -from oauth2client.django_orm import FlowField, CredentialsField +from oauth2client.contrib.django_orm import FlowField, CredentialsField from http_handler import settings from http_handler.settings import AUTH_USER_MODEL diff --git a/smtp_handler/utils.py b/smtp_handler/utils.py index ad5bee63..c1f3b58e 100644 --- a/smtp_handler/utils.py +++ b/smtp_handler/utils.py @@ -295,7 +295,7 @@ def get_attachments(email_message): res['attachments'].append({'content': part_data, 'mime': content_type, - 'filename': part.get_filename(), + 'filename': part.generate_filename(), 'disposition': disposition, 'id': content_id}) else: From 9299fffd720bcac608fe4a7f49b390d54fa9f23e Mon Sep 17 00:00:00 2001 From: Raxel Gutierrez Date: Wed, 8 Jul 2020 15:29:15 -0400 Subject: [PATCH 06/11] Fixed issues with django 1.10 upgrade --- browser/templates/murmur/group_page.html | 2 -- requirements.txt | 4 ++-- scripts/new_database_unsafe.sh | 8 +++----- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/browser/templates/murmur/group_page.html b/browser/templates/murmur/group_page.html index 36589b7c..fea7e34d 100644 --- a/browser/templates/murmur/group_page.html +++ b/browser/templates/murmur/group_page.html @@ -248,10 +248,8 @@

Associated Mailing Lists

{% endfor %} - {% endif %}
- {% endif %} {% endblock %} {% block customjs %} diff --git a/requirements.txt b/requirements.txt index 9ab68e36..0f4d3a14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,12 +3,12 @@ Jinja2==2.10.3 MarkupSafe==0.23 mysqlclient==1.4.6 bleach==1.4 -chardet==2.3.0 +chardet==3.0.4 django-annoying==0.10.4 django-appconf==0.6 django-compressor==1.4 django-gravatar==0.1.0 -django-registration==2.0 +django-registration==2.4 html2text==2014.9.25 html5lib==1.0b3 ipython==2.3.0 diff --git a/scripts/new_database_unsafe.sh b/scripts/new_database_unsafe.sh index 94699130..ed3e1df2 100755 --- a/scripts/new_database_unsafe.sh +++ b/scripts/new_database_unsafe.sh @@ -27,11 +27,6 @@ cd /home/ubuntu/production/mailx && \ EOF } && \ -# create the initial tables -# python manage.py syncdb && \ - -# create the initial schema migration with south -# python manage.py schemamigration schema --initial && \ python manage.py makemigrations schema && \ # TODO call it later @@ -42,6 +37,9 @@ python manage.py migrate --noinput && \ # apply the schema migration python manage.py migrate schema && \ +# sync with registration db +python manage.py migrate --run-syncdb + # alter tables to utf8 { mysql -h $DATABASE_HOST -u root -p$MYSQL_PASS < Date: Sun, 27 Sep 2020 15:43:31 -0400 Subject: [PATCH 07/11] Merge --- README.md | 16 +++++++--------- browser/views.py | 4 +++- config/settings.py | 3 +++ docker-compose.yml | 1 + http_handler/settings.py | 4 ++-- smtp_handler/main.py | 3 ++- smtp_handler/utils.py | 4 ++-- 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bc60980e..043c1b42 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/haystack/murmur?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Django version](https://img.shields.io/badge/django-1.6-blue.svg)](https://docs.djangoproject.com/en/2.2/releases/1.6/) [![python version](https://img.shields.io/badge/python-2.7-yellowgreen.svg)](https://www.python.org/download/releases/2.7/) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/haystack/murmur?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Django version](https://img.shields.io/badge/Django-1.10-blue)](https://docs.djangoproject.com/en/3.0/releases/1.10/) [![python version](https://img.shields.io/badge/python-2.7-yellowgreen.svg)](https://www.python.org/download/releases/2.7/) Murmur = @@ -10,10 +10,15 @@ Murmur uses Django with a MySQL backend (you can replace with any other backend Please contact us for an example of the private file. You cannot run the program without it. +#### Install MySQL Server + #### setup the database * change the root mysql account to one written in private file. * make sure you can log in to mysql with the password in the command line: `mysql -u root -p` +#### Install Git and clone this repository +* `git clone https://github.com/haystack/murmur.git` + ## Running Docker **Recommended to use Linux** @@ -39,13 +44,6 @@ In order to stop docker you can simply run `make stop` and run `make start` to s ## Not Running Docker i.e. on the server -### Web Installation Instructions - -#### Install MySQL Server - -#### Install Git and clone this repository -* `git clone https://github.com/haystack/murmur.git` - #### install required linux packages if on linux * `sudo apt-get install libmysqlclient-dev python-dev` @@ -81,7 +79,7 @@ In order to stop docker you can simply run `make stop` and run `make start` to s #### setup the database * `mysql -u root -p` * `create database murmur;` -* Give privileges to the user that will access the database from django: `grant all privileges ON murmur.* TO admin@localhost;` +* Give privileges to the user that will access the database from django: `grant all privileges ON murmur.* TO root@localhost;` #### install schema and create superuser * `python manage.py syncdb`and create superuser diff --git a/browser/views.py b/browser/views.py index 2ec9f4c3..1fa3998d 100644 --- a/browser/views.py +++ b/browser/views.py @@ -75,6 +75,8 @@ def error(request): res['error'] = 'You do not have permission to visit this page.' elif error == 'thread': res['error'] = 'This thread no longer exists.' + elif error == 'request_login': + res['error'] = "This group is private. Please log in to view the posts." else: res['error'] = 'Unknown error.' return res @@ -157,7 +159,7 @@ def post_list(request): tag_info = Tag.objects.filter(group=group).annotate(num_p=Count('tagthread')).order_by('-num_p') if not group.public: - return redirect('/404?e=member') + return redirect('/404?e=request_login') else: res = engine.main.list_posts(group_name=request.GET.get('group_name'), format_datetime=False, return_replies=False) return {'user': request.user, 'groups': groups, 'posts': res, 'active_group': active_group, "tag_info": tag_info} diff --git a/config/settings.py b/config/settings.py index cf755b09..861ee2e7 100644 --- a/config/settings.py +++ b/config/settings.py @@ -19,4 +19,7 @@ # hook django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "http_handler.settings") +import django +django.setup() + # the config/boot.py will turn these values into variables set in settings diff --git a/docker-compose.yml b/docker-compose.yml index 68280ca2..91ea57d8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -34,6 +34,7 @@ services: expose: - 587-8825 environment: + - RELAY_HOST=${RELAY_HOST} - GMAIL_USER=${GMAIL_USER} - GMAIL_PASSWORD=${GMAIL_PASSWORD} - PORT=8825 diff --git a/http_handler/settings.py b/http_handler/settings.py index 5f4af261..45659f9f 100644 --- a/http_handler/settings.py +++ b/http_handler/settings.py @@ -84,9 +84,9 @@ def _get_website(): LOGIN_REDIRECT_URL = "/" + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_USE_TLS = True -DEFAULT_EMAIL = 'no-reply@' + BASE_URL +DEFAULT_EMAIL = 'no-reply@' + ("localhost" if "localhost" in BASE_URL else BASE_URL) DEFAULT_FROM_EMAIL = DEFAULT_EMAIL diff --git a/smtp_handler/main.py b/smtp_handler/main.py index 550debc8..c7af7a17 100644 --- a/smtp_handler/main.py +++ b/smtp_handler/main.py @@ -698,7 +698,8 @@ def handle_post_squadbox(message, group, host, verified): def handle_post(message, address=None, host=None): # restart the db connection - django.db.close_connection() + # deprecated at django18 + # django.db.close_connection() if '+' in address and '__' in address: return diff --git a/smtp_handler/utils.py b/smtp_handler/utils.py index c1f3b58e..52897992 100644 --- a/smtp_handler/utils.py +++ b/smtp_handler/utils.py @@ -20,7 +20,7 @@ logger = logging.getLogger('murmur') -HOST = BASE_URL +HOST = "localhost" if "localhost" in BASE_URL else BASE_URL NO_REPLY = DEFAULT_FROM_EMAIL POST_SUFFIX = '__post__' FOLLOW_SUFFIX = '__follow__' @@ -35,7 +35,7 @@ DOWNVOTE_SUFFIX = '__downvote__' FETCH_SUFFIX = '__fetch__' -ADMIN_EMAILS = ['axz@mit.edu', 'kmahar@mit.edu'] +ADMIN_EMAILS = ['soya@mit.edu'] FOLLOW_ADDR = 'http://%s/follow?tid=' % (HOST) UNFOLLOW_ADDR = 'http://%s/unfollow?tid=' % (HOST) From d1bab31bfd8708e608733ec03780a75408174685 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 27 Sep 2020 20:05:04 -0400 Subject: [PATCH 08/11] Add logging for web sending --- browser/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/browser/views.py b/browser/views.py index 1fa3998d..112aa19c 100644 --- a/browser/views.py +++ b/browser/views.py @@ -28,6 +28,8 @@ request_error = json.dumps({'code': msg_code['REQUEST_ERROR'],'status':False}) +logger = logging.getLogger('murmur') + if WEBSITE == 'murmur': group_or_squad = 'group' elif WEBSITE == 'squadbox': @@ -866,6 +868,7 @@ def insert_post(request): mail.Body = html2text(msg_text) + ps_blurb relay_mailer.deliver(mail, To = recip.email) + logger.debug("Send email to " + recip.email) fwding_lists = ForwardingList.objects.filter(group=g, can_receive=True) From dd7a306a1400730c5d563564abec3e350cf6dda9 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 27 Sep 2020 21:51:33 -0400 Subject: [PATCH 09/11] Replace send_mail() to lamson email --- browser/views.py | 1 + registration/forms.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/browser/views.py b/browser/views.py index 112aa19c..6388140b 100644 --- a/browser/views.py +++ b/browser/views.py @@ -808,6 +808,7 @@ def load_thread(request): @login_required def insert_post(request): try: + logger.debug("insert post") user = get_object_or_404(UserProfile, email=request.user.email) group_name = request.POST['group_name'] diff --git a/registration/forms.py b/registration/forms.py index 96933849..480cbeff 100644 --- a/registration/forms.py +++ b/registration/forms.py @@ -19,6 +19,9 @@ from django.utils.http import urlsafe_base64_encode from django.utils.translation import ugettext_lazy as _ from http_handler.settings import WEBSITE +import logging + +logger = logging.getLogger('murmur') class RegistrationForm(forms.Form): """ @@ -113,12 +116,15 @@ class MurmurPasswordResetForm(PasswordResetForm): def save(self, domain_override=None, subject_template_name='registration/password_reset_subject.txt', email_template_name='registration/password_reset_email.html', + extra_email_context=None, html_email_template_name="", use_https=False, token_generator=default_token_generator, from_email=None, request=None): """ Generates a one-use only link for resetting password and sends to the user. """ + logger.info("reset form") + from django.core.mail import send_mail UserModel = get_user_model() email = self.cleaned_data["email"] @@ -148,5 +154,9 @@ def save(self, domain_override=None, # Email subject *must not* contain newlines subject = ''.join(subject.splitlines()) email = loader.render_to_string(email_template_name, c) - send_mail(subject, email, from_email, [user.email]) + + from smtp_handler.utils import relay_mailer + from lamson.mail import MailResponse + mail = MailResponse(From = from_email, To = user.email, Subject = subject, Body = email) + relay_mailer.deliver(mail, To=user.email) From c0bf40cc4c79a0be5aa6d8d644e73014218a3b44 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 27 Sep 2020 22:15:05 -0400 Subject: [PATCH 10/11] Change registration email to lamson email --- registration/forms.py | 6 +++--- schema/models.py | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/registration/forms.py b/registration/forms.py index 480cbeff..2cb2d0e0 100644 --- a/registration/forms.py +++ b/registration/forms.py @@ -18,7 +18,7 @@ from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_encode from django.utils.translation import ugettext_lazy as _ -from http_handler.settings import WEBSITE +from http_handler.settings import WEBSITE, DEFAULT_FROM_EMAIL import logging logger = logging.getLogger('murmur') @@ -154,9 +154,9 @@ def save(self, domain_override=None, # Email subject *must not* contain newlines subject = ''.join(subject.splitlines()) email = loader.render_to_string(email_template_name, c) - + from smtp_handler.utils import relay_mailer from lamson.mail import MailResponse - mail = MailResponse(From = from_email, To = user.email, Subject = subject, Body = email) + mail = MailResponse(From = DEFAULT_FROM_EMAIL, To = user.email, Subject = subject, Body = email) relay_mailer.deliver(mail, To=user.email) diff --git a/schema/models.py b/schema/models.py index 44550d0e..2db16fe2 100644 --- a/schema/models.py +++ b/schema/models.py @@ -6,7 +6,7 @@ from oauth2client.contrib.django_orm import FlowField, CredentialsField from http_handler import settings -from http_handler.settings import AUTH_USER_MODEL +from http_handler.settings import AUTH_USER_MODEL, DEFAULT_FROM_EMAIL class Post(models.Model): id = models.AutoField(primary_key=True) @@ -305,6 +305,10 @@ def email_user(self, subject, message, from_email=None): Sends an email to this User. """ send_mail(subject, message, from_email, [self.email]) + from smtp_handler.utils import relay_mailer + from lamson.mail import MailResponse + mail = MailResponse(From = DEFAULT_FROM_EMAIL, To = self.email, Subject = subject, Body = message) + relay_mailer.deliver(mail, To=self.email) def has_perm(self, perm, obj=None): "Does the user have a specific permission?" From 93cf528ce808c32c7e164df5f46584787766f889 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 27 Sep 2020 22:17:10 -0400 Subject: [PATCH 11/11] Delete the line --- schema/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/schema/models.py b/schema/models.py index 2db16fe2..cf132a31 100644 --- a/schema/models.py +++ b/schema/models.py @@ -304,7 +304,6 @@ def email_user(self, subject, message, from_email=None): """ Sends an email to this User. """ - send_mail(subject, message, from_email, [self.email]) from smtp_handler.utils import relay_mailer from lamson.mail import MailResponse mail = MailResponse(From = DEFAULT_FROM_EMAIL, To = self.email, Subject = subject, Body = message)