From 7ca1099806ff77766c22e01812c83254fab0dd76 Mon Sep 17 00:00:00 2001 From: raxelg Date: Fri, 26 Jun 2020 20:44:58 -0400 Subject: [PATCH 01/44] Successfully upgraded to django1.8 --- browser/views.py | 4 +- gmail_setup/urls.py | 7 +- http_handler/settings.py | 46 ++--- http_handler/urls.py | 175 +++++++++--------- registration/auth_urls.py | 74 ++++---- registration/backends/default/urls.py | 49 +++-- registration/backends/simple/urls.py | 22 +-- .../commands/cleanupregistration.py | 6 +- registration/models.py | 2 +- registration/tests/urls.py | 126 ++++++------- requirements.txt | 6 +- 11 files changed, 255 insertions(+), 262 deletions(-) diff --git a/browser/views.py b/browser/views.py index a0a6ead7..be1c818b 100644 --- a/browser/views.py +++ b/browser/views.py @@ -8,7 +8,7 @@ from django.conf import global_settings from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import AuthenticationForm -from django.core.context_processors import csrf +from django.template.context_processors import csrf from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.db.models.aggregates import Count @@ -86,7 +86,7 @@ def index(request): return render_to_response(homepage, {'form': AuthenticationForm(), 'reg_form': RegistrationForm()}, - context_instance=RequestContext(request)) + context=RequestContext(request)) else: if WEBSITE == 'murmur': return HttpResponseRedirect('/posts') diff --git a/gmail_setup/urls.py b/gmail_setup/urls.py index e05fcb6c..d532808f 100644 --- a/gmail_setup/urls.py +++ b/gmail_setup/urls.py @@ -1,8 +1,7 @@ -from django.conf.urls import patterns, include, url +from django.conf.urls import url from . import views -urlpatterns = patterns( - '', +urlpatterns = [ url(r'^$', views.index, name='index'), url(r'authorize', views.auth, name='auth'), url(r'callback', views.auth_return, name='return'), @@ -10,4 +9,4 @@ url(r'initial_filters', views.initial_filters, name='initial_filters'), url(r'done', views.index, name='done'), url(r'forget', views.deauth, name='forget'), -) \ No newline at end of file +] \ No newline at end of file diff --git a/http_handler/settings.py b/http_handler/settings.py index 62ced9c9..93394072 100644 --- a/http_handler/settings.py +++ b/http_handler/settings.py @@ -77,8 +77,6 @@ def _get_website(): BASE_URL = 'localhost:8000' MYSQL = MYSQL_LOCAL -TEMPLATE_DEBUG = DEBUG - LOGIN_REDIRECT_URL = "/" EMAIL_HOST = 'localhost' @@ -167,23 +165,34 @@ def _get_website(): # Make this unique, and don't share it with anybody. SECRET_KEY = 'fr&qg*+c!z6q_^v6o1kzd6lxj-3m3q-=oku8f52*c+@)+1hnx+' -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - 'django_mobile.loader.Loader', - - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', -) - -TEMPLATE_CONTEXT_PROCESSORS = ( - 'django_mobile.context_processors.flavour', - -) +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + PROJECT_DIR + "browser/templates", + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # 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', + 'django.template.loaders.app_directories.Loader', + # 'django_mobile.loader.Loader', + # 'django.template.loaders.eggs.Loader', + ] + }, + }, +] MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', @@ -200,13 +209,6 @@ def _get_website(): # Python dotted path to the WSGI application used by Django's runserver. WSGI_APPLICATION = 'http_handler.wsgi.application' -TEMPLATE_DIRS = ( - PROJECT_DIR + "browser/templates", - # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. -) - # one week activation window after a user signs up for an account ACCOUNT_ACTIVATION_DAYS = 7 diff --git a/http_handler/urls.py b/http_handler/urls.py index ff52bae2..29ed32ca 100644 --- a/http_handler/urls.py +++ b/http_handler/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import patterns, include, url +from django.conf.urls import include, url from django.contrib.auth import views as auth_views from django.views.generic.base import TemplateView from browser.views import * @@ -11,9 +11,8 @@ website_context = {'website' : WEBSITE} -# shared URL patterns -urlpatterns = patterns('', - +#shared URL patterns +urlpatterns = [ url(r'^$', 'browser.views.index'), url(r'^lamson_status', 'browser.views.lamson_status'), url(r'^settings', 'browser.views.settings'), @@ -99,76 +98,76 @@ url(r'^activate_group', 'browser.views.activate_group'), url(r'^deactivate_group', 'browser.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'^unsubscribe_get', 'browser.views.unsubscribe_get'), - url(r'^subscribe_get', 'browser.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'^load_post', 'browser.views.load_post'), - url(r'^load_thread', 'browser.views.load_thread'), - - url(r'^list_posts', 'browser.views.list_posts'), - url(r'^refresh_posts', 'browser.views.refresh_posts'), - - url(r'^insert_post', 'browser.views.insert_post'), - url(r'^insert_reply', 'browser.views.insert_reply'), - - url(r'^upvote_get', 'browser.views.upvote_get'), - url(r'^unupvote_get', 'browser.views.unupvote_get'), - - url(r'^upvote', 'browser.views.upvote'), - url(r'^unupvote', 'browser.views.unupvote'), - - url(r'^follow_tag_get', 'browser.views.follow_tag_get'), - url(r'^unfollow_tag_get', 'browser.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'^follow_tag', 'browser.views.follow_tag'), - url(r'^unfollow_tag', 'browser.views.unfollow_tag'), - - url(r'^mute_tag', 'browser.views.mute_tag'), - url(r'^unmute_tag', 'browser.views.unmute_tag'), - - url(r'^follow_thread', 'browser.views.follow_thread'), - url(r'^unfollow_thread', 'browser.views.unfollow_thread'), - - url(r'^mute_thread', 'browser.views.mute_thread'), - url(r'^unmute_thread', 'browser.views.unmute_thread'), - - url(r'^follow', 'browser.views.follow_thread_get'), - url(r'^unfollow', 'browser.views.unfollow_thread_get'), - - url(r'^mute', 'browser.views.mute_thread_get'), - url(r'^unmute', 'browser.views.unmute_thread_get'), - - url(r'^add_list', 'browser.views.add_list'), - url(r'^delete_list', 'browser.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'^about', 'browser.views.about'), + url(r'^posts$', 'browser.views.post_list'), + + url(r'^unsubscribe_get', 'browser.views.unsubscribe_get'), + url(r'^subscribe_get', 'browser.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'^load_post', 'browser.views.load_post'), + url(r'^load_thread', 'browser.views.load_thread'), + + url(r'^list_posts', 'browser.views.list_posts'), + url(r'^refresh_posts', 'browser.views.refresh_posts'), + + url(r'^insert_post', 'browser.views.insert_post'), + url(r'^insert_reply', 'browser.views.insert_reply'), + + url(r'^upvote_get', 'browser.views.upvote_get'), + url(r'^unupvote_get', 'browser.views.unupvote_get'), + + url(r'^upvote', 'browser.views.upvote'), + url(r'^unupvote', 'browser.views.unupvote'), + + url(r'^follow_tag_get', 'browser.views.follow_tag_get'), + url(r'^unfollow_tag_get', 'browser.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'^follow_tag', 'browser.views.follow_tag'), + url(r'^unfollow_tag', 'browser.views.unfollow_tag'), + + url(r'^mute_tag', 'browser.views.mute_tag'), + url(r'^unmute_tag', 'browser.views.unmute_tag'), + + url(r'^follow_thread', 'browser.views.follow_thread'), + url(r'^unfollow_thread', 'browser.views.unfollow_thread'), + + url(r'^mute_thread', 'browser.views.mute_thread'), + url(r'^unmute_thread', 'browser.views.unmute_thread'), + + url(r'^follow', 'browser.views.follow_thread_get'), + url(r'^unfollow', 'browser.views.unfollow_thread_get'), + + url(r'^mute', 'browser.views.mute_thread_get'), + url(r'^unmute', 'browser.views.unmute_thread_get'), + + url(r'^add_list', 'browser.views.add_list'), + url(r'^delete_list', 'browser.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'), + ] urlpatterns.extend(new_patterns) @@ -176,31 +175,31 @@ elif WEBSITE == 'squadbox': new_patterns = [ - url(r'^mod_queue/(?P[\w-]+)', 'browser.views.mod_queue'), + url(r'^mod_queue/(?P[\w-]+)', 'browser.views.mod_queue'), - # url(r'^approve_get', 'browser.views.approve_get'), - # url(r'^reject_get', 'browser.views.reject_get'), + # 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', 'browser.views.approve_post'), + url(r'^reject_post', 'browser.views.reject_post'), - url(r'^delete_posts', 'browser.views.delete_posts'), - url(r'^delete_post', 'browser.views.delete_post'), + url(r'^delete_posts', 'browser.views.delete_posts'), + url(r'^delete_post', 'browser.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', 'browser.views.whitelist_get'), + url(r'^whitelist', 'browser.views.whitelist'), + url(r'^groups/(?P[\w-]+)/add_whitelist', 'browser.views.add_whitelist_view'), - url(r'^unblacklist_unwhitelist', 'browser.views.unblacklist_unwhitelist'), + url(r'^unblacklist_unwhitelist', 'browser.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', 'browser.views.blacklist_get'), + url(r'^blacklist', 'browser.views.blacklist'), + url(r'^groups/(?P[\w-]+)/add_blacklist', 'browser.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', 'browser.views.rejected'), + url(r'^rejected_thread$', 'browser.views.rejected_thread'), - url(r'^moderate_user_for_thread_get', 'browser.views.moderate_user_for_thread_get'), - ] + url(r'^moderate_user_for_thread_get', 'browser.views.moderate_user_for_thread_get'), + ] urlpatterns.extend(new_patterns) diff --git a/registration/auth_urls.py b/registration/auth_urls.py index 09fbaee1..f276f991 100644 --- a/registration/auth_urls.py +++ b/registration/auth_urls.py @@ -23,8 +23,6 @@ """ -from django.conf.urls import include -from django.conf.urls import patterns from django.conf.urls import url from django.contrib.auth import views as auth_views @@ -32,39 +30,39 @@ from http_handler.settings import WEBSITE -urlpatterns = patterns('', - url(r'^login/$', - auth_views.login, - {'template_name': 'registration/login.html', - 'extra_context' : {'website' : WEBSITE}, - }, - name='auth_login'), - url(r'^logout/$', - auth_views.logout, - {'template_name': 'registration/logout.html', - 'extra_context' : {'website' : WEBSITE}, - }, - name='auth_logout'), - url(r'^password/change/$', - murmur_acct, - {'acct_func': auth_views.password_change}, - name='auth_password_change', - ), - url(r'^password/change/done/$', - murmur_acct, - {'acct_func': auth_views.password_change_done}, - name='auth_password_change_done', - ), - url(r'^password/reset/$', - auth_views.password_reset, - name='auth_password_reset'), - url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', - auth_views.password_reset_confirm, - name='auth_password_reset_confirm'), - url(r'^password/reset/complete/$', - auth_views.password_reset_complete, - name='auth_password_reset_complete'), - url(r'^password/reset/done/$', - auth_views.password_reset_done, - name='auth_password_reset_done'), -) +urlpatterns = [ + url(r'^login/$', + auth_views.login, + {'template_name': 'registration/login.html', + 'extra_context' : {'website' : WEBSITE}, + }, + name='auth_login'), + url(r'^logout/$', + auth_views.logout, + {'template_name': 'registration/logout.html', + 'extra_context' : {'website' : WEBSITE}, + }, + name='auth_logout'), + url(r'^password/change/$', + murmur_acct, + {'acct_func': auth_views.password_change}, + name='auth_password_change', + ), + url(r'^password/change/done/$', + murmur_acct, + {'acct_func': auth_views.password_change_done}, + name='auth_password_change_done', + ), + url(r'^password/reset/$', + auth_views.password_reset, + name='auth_password_reset'), + url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', + auth_views.password_reset_confirm, + name='auth_password_reset_confirm'), + url(r'^password/reset/complete/$', + auth_views.password_reset_complete, + name='auth_password_reset_complete'), + url(r'^password/reset/done/$', + auth_views.password_reset_done, + name='auth_password_reset_done'), +] \ No newline at end of file diff --git a/registration/backends/default/urls.py b/registration/backends/default/urls.py index 3321c9dc..6f08db05 100644 --- a/registration/backends/default/urls.py +++ b/registration/backends/default/urls.py @@ -17,34 +17,31 @@ """ -from django.conf.urls import patterns -from django.conf.urls import include -from django.conf.urls import url +from django.conf.urls import url,include from django.views.generic.base import TemplateView from registration.backends.default.views import ActivationView from registration.backends.default.views import RegistrationView - -urlpatterns = patterns('', - url(r'^activate/complete/$', - TemplateView.as_view(template_name='registration/activation_complete.html'), - name='registration_activation_complete'), - # Activation keys get matched by \w+ instead of the more specific - # [a-fA-F0-9]{40} because a bad activation key should still get to the view; - # that way it can return a sensible "invalid key" message instead of a - # confusing 404. - url(r'^activate/(?P\w+)/$', - ActivationView.as_view(), - name='registration_activate'), - url(r'^register/$', - RegistrationView.as_view(), - name='registration_register'), - url(r'^register/complete/$', - TemplateView.as_view(template_name='registration/registration_complete.html'), - name='registration_complete'), - url(r'^register/closed/$', - TemplateView.as_view(template_name='registration/registration_closed.html'), - name='registration_disallowed'), - (r'', include('registration.auth_urls')), - ) +urlpatterns = [ + url(r'^activate/complete/$', + TemplateView.as_view(template_name='registration/activation_complete.html'), + name='registration_activation_complete'), + # Activation keys get matched by \w+ instead of the more specific + # [a-fA-F0-9]{40} because a bad activation key should still get to the view; + # that way it can return a sensible "invalid key" message instead of a + # confusing 404. + url(r'^activate/(?P\w+)/$', + ActivationView.as_view(), + name='registration_activate'), + url(r'^register/$', + RegistrationView.as_view(), + name='registration_register'), + url(r'^register/complete/$', + TemplateView.as_view(template_name='registration/registration_complete.html'), + name='registration_complete'), + url(r'^register/closed/$', + TemplateView.as_view(template_name='registration/registration_closed.html'), + name='registration_disallowed'), + url(r'', include('registration.auth_urls')), +] \ No newline at end of file diff --git a/registration/backends/simple/urls.py b/registration/backends/simple/urls.py index dd216298..49aa7ca6 100644 --- a/registration/backends/simple/urls.py +++ b/registration/backends/simple/urls.py @@ -17,21 +17,19 @@ """ -from django.conf.urls import include -from django.conf.urls import patterns -from django.conf.urls import url +from django.conf.urls import url, include from django.views.generic.base import TemplateView from registration.backends.simple.views import RegistrationView from http_handler.settings import WEBSITE -urlpatterns = patterns('', - url(r'^register/$', - RegistrationView.as_view(), - name='registration_register'), - url(r'^register/closed/$', - TemplateView.as_view(template_name=WEBSITE+'/registration/registration_closed.html'), - name='registration_disallowed'), - (r'', include('registration.auth_urls')), - ) +urlpatterns = [ + url(r'^register/$', + RegistrationView.as_view(), + name='registration_register'), + url(r'^register/closed/$', + TemplateView.as_view(template_name=WEBSITE+'/registration/registration_closed.html'), + name='registration_disallowed'), + url(r'', include('registration.auth_urls')), +] diff --git a/registration/management/commands/cleanupregistration.py b/registration/management/commands/cleanupregistration.py index abec5aed..d41a4831 100644 --- a/registration/management/commands/cleanupregistration.py +++ b/registration/management/commands/cleanupregistration.py @@ -7,13 +7,13 @@ """ -from django.core.management.base import NoArgsCommand +from django.core.management.base import BaseCommand from registration.models import RegistrationProfile -class Command(NoArgsCommand): +class Command(BaseCommand): help = "Delete expired user registrations from the database" - def handle_noargs(self, **options): + def handle(self, **options): RegistrationProfile.objects.delete_expired_users() diff --git a/registration/models.py b/registration/models.py index 1868e408..2e478859 100644 --- a/registration/models.py +++ b/registration/models.py @@ -94,7 +94,7 @@ def create_inactive_user(self, email, password, return new_user - create_inactive_user = transaction.commit_on_success(create_inactive_user) + create_inactive_user = transaction.atomic(create_inactive_user) def create_profile(self, user): """ diff --git a/registration/tests/urls.py b/registration/tests/urls.py index 02ef6090..8772c5e6 100644 --- a/registration/tests/urls.py +++ b/registration/tests/urls.py @@ -17,66 +17,66 @@ from registration.views import register -urlpatterns = patterns('', - # Test the 'activate' view with custom template - # name. - url(r'^activate-with-template-name/(?P\w+)/$', - activate, - {'template_name': 'registration/test_template_name.html', - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_activate_template_name'), - # Test the 'activate' view with - # extra_context_argument. - url(r'^activate-extra-context/(?P\w+)/$', - activate, - {'extra_context': {'foo': 'bar', 'callable': lambda: 'called'}, - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_activate_extra_context'), - # Test the 'activate' view with success_url argument. - url(r'^activate-with-success-url/(?P\w+)/$', - activate, - {'success_url': 'registration_test_custom_success_url', - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_activate_success_url'), - # Test the 'register' view with custom template - # name. - url(r'^register-with-template-name/$', - register, - {'template_name': 'registration/test_template_name.html', - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_register_template_name'), - # Test the'register' view with extra_context - # argument. - url(r'^register-extra-context/$', - register, - {'extra_context': {'foo': 'bar', 'callable': lambda: 'called'}, - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_register_extra_context'), - # Test the 'register' view with custom URL for - # closed registration. - url(r'^register-with-disallowed-url/$', - register, - {'disallowed_url': 'registration_test_custom_disallowed', - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_register_disallowed_url'), - # Set up a pattern which will correspond to the - # custom 'disallowed_url' above. - url(r'^custom-disallowed/$', - direct_to_template, - {'template': 'registration/registration_closed.html'}, - name='registration_test_custom_disallowed'), - # Test the 'register' view with custom redirect - # on successful registration. - url(r'^register-with-success_url/$', - register, - {'success_url': 'registration_test_custom_success_url', - 'backend': 'registration.backends.default.DefaultBackend'}, - name='registration_test_register_success_url' - ), - # Pattern for custom redirect set above. - url(r'^custom-success/$', - direct_to_template, - {'template': 'registration/test_template_name.html'}, - name='registration_test_custom_success_url'), - (r'', include('registration.backends.default.urls')), - ) +urlpatterns = [ + # Test the 'activate' view with custom template + # name. + url(r'^activate-with-template-name/(?P\w+)/$', + activate, + {'template_name': 'registration/test_template_name.html', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_activate_template_name'), + # Test the 'activate' view with + # extra_context_argument. + url(r'^activate-extra-context/(?P\w+)/$', + activate, + {'extra_context': {'foo': 'bar', 'callable': lambda: 'called'}, + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_activate_extra_context'), + # Test the 'activate' view with success_url argument. + url(r'^activate-with-success-url/(?P\w+)/$', + activate, + {'success_url': 'registration_test_custom_success_url', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_activate_success_url'), + # Test the 'register' view with custom template + # name. + url(r'^register-with-template-name/$', + register, + {'template_name': 'registration/test_template_name.html', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_template_name'), + # Test the'register' view with extra_context + # argument. + url(r'^register-extra-context/$', + register, + {'extra_context': {'foo': 'bar', 'callable': lambda: 'called'}, + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_extra_context'), + # Test the 'register' view with custom URL for + # closed registration. + url(r'^register-with-disallowed-url/$', + register, + {'disallowed_url': 'registration_test_custom_disallowed', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_disallowed_url'), + # Set up a pattern which will correspond to the + # custom 'disallowed_url' above. + url(r'^custom-disallowed/$', + direct_to_template, + {'template': 'registration/registration_closed.html'}, + name='registration_test_custom_disallowed'), + # Test the 'register' view with custom redirect + # on successful registration. + url(r'^register-with-success_url/$', + register, + {'success_url': 'registration_test_custom_success_url', + 'backend': 'registration.backends.default.DefaultBackend'}, + name='registration_test_register_success_url' + ), + # Pattern for custom redirect set above. + url(r'^custom-success/$', + direct_to_template, + {'template': 'registration/test_template_name.html'}, + name='registration_test_custom_success_url'), + url(r'', include('registration.backends.default.urls')), +] diff --git a/requirements.txt b/requirements.txt index 13e5b3e4..f3449945 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -Django==1.7 -Jinja2==2.7.3 +Django==1.8 +Jinja2==2.10.3 MarkupSafe==0.23 mysqlclient==1.4.6 bleach==1.4 @@ -9,7 +9,7 @@ django-appconf==0.6 django-compressor==1.4 django-gravatar==0.1.0 django-mobile==0.4.0 -django-registration==1.0 +django-registration==2.0 html2text==2014.9.25 html5lib==1.0b3 ipython==2.3.0 From e461bb58840ac21303e1b1b25ce3983d4d77378c Mon Sep 17 00:00:00 2001 From: raxelg Date: Sat, 27 Jun 2020 21:31:39 -0400 Subject: [PATCH 02/44] Fixed bug with deprecated code in django1.8 --- browser/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/browser/views.py b/browser/views.py index be1c818b..d272a287 100644 --- a/browser/views.py +++ b/browser/views.py @@ -83,10 +83,10 @@ def error(request): def index(request): homepage = "%s/home.html" % WEBSITE if not request.user.is_authenticated(): - return render_to_response(homepage, - {'form': AuthenticationForm(), - 'reg_form': RegistrationForm()}, - context=RequestContext(request)) + return render(request, + homepage, + {'form': AuthenticationForm(), + 'reg_form': RegistrationForm()}) else: if WEBSITE == 'murmur': return HttpResponseRedirect('/posts') From c789d32e0f9a09cb386dc5577a628e6c1a09e5a2 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 28 Jun 2020 14:29:04 -0400 Subject: [PATCH 03/44] 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 04/44] 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 05/44] 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 06/44] 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 07/44] 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 08/44] 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: Wed, 23 Sep 2020 20:31:09 -0400 Subject: [PATCH 09/44] =?UTF-8?q?Divide=20Raxel=E2=80=99s=20pr=20to=20upgr?= =?UTF-8?q?ade=20the=20server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d58f7212..0482b8b3 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.6-blue.svg)]1.8(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/) Murmur = From cb6e9a1f9b33f46db7d7fb98ce3c32731e660ece Mon Sep 17 00:00:00 2001 From: soyapark Date: Fri, 25 Sep 2020 14:18:44 -0400 Subject: [PATCH 10/44] Fix app registry issue --- config/settings.py | 3 +++ docker-compose.yml | 1 + http_handler/settings.py | 8 +++----- smtp_handler/utils.py | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) 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 03c42de2..71ad359d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,7 @@ services: ports: - "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 93394072..c61857ac 100644 --- a/http_handler/settings.py +++ b/http_handler/settings.py @@ -79,12 +79,10 @@ 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 -DEFAULT_EMAIL = 'no-reply@' + BASE_URL +EMAIL_USE_TLS = True +DEFAULT_EMAIL = 'no-reply@' + "localhost" if "localhost" in BASE_URL else BASE_URL DEFAULT_FROM_EMAIL = DEFAULT_EMAIL diff --git a/smtp_handler/utils.py b/smtp_handler/utils.py index ad5bee63..6a406f60 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__' From 6338b93a8b9247e574a262d5e49dc4799f9413bc Mon Sep 17 00:00:00 2001 From: soyapark Date: Fri, 25 Sep 2020 14:43:55 -0400 Subject: [PATCH 11/44] Comment out deprecated code --- smtp_handler/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 From 436099b97cb3e06f1548b828db5b1365bbced153 Mon Sep 17 00:00:00 2001 From: Soya <33616044+soyapark@users.noreply.github.com> Date: Sun, 27 Sep 2020 19:38:38 +0000 Subject: [PATCH 12/44] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e07baf2..e8e0b7cb 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Currently you need a gmail account in order for Murmur to send verification emai Next set up the environment variables. The only variables you should need to set are your gmail username and password. 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. +2. Fill in the correct values in `.env` for your gmail account. Put your gmail address and a google app password. 3. Use `make` to create the database and create a superuser account to login 4. Check it out on `localhost:8000 From c9753c152faa4f9fd48a859e20630fb32aae5793 Mon Sep 17 00:00:00 2001 From: soyapark Date: Sun, 27 Sep 2020 15:43:31 -0400 Subject: [PATCH 13/44] 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 14/44] 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 15/44] 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 16/44] 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 17/44] 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) From d53405d765c1ac60cb21bb4e93a8163ee908e00d Mon Sep 17 00:00:00 2001 From: angcast Date: Wed, 11 Nov 2020 10:11:43 -0500 Subject: [PATCH 18/44] Made database changes and added friendly name throughout code --- .env.example | 5 ++--- engine/main.py | 6 ++++-- http_handler/static/javascript/create_group.js | 2 +- schema/models.py | 3 +++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index 2dda0aa7..b49e2aa5 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,7 @@ # Please enter your gmail address # Also create an gmail app password -GMAIL_USER=YOUR_GMAIL_ACCOUNT@GMAIL.COM -GMAIL_PASSWORD=YOUR_APP_PASSWORD - +GMAIL_USER=angelica.castillejoss@GMAIL.COM +GMAIL_PASSWORD=ivuhzrgjsmaiyefg diff --git a/engine/main.py b/engine/main.py index 603f406f..0e55e402 100644 --- a/engine/main.py +++ b/engine/main.py @@ -255,7 +255,9 @@ def edit_donotsend_table(group_name, toDelete, user): def create_group(group_name, group_desc, public, attach, send_rejected, store_rejected, mod_edit_wl_bl, mod_rules, auto_approve, requester): res = {'status':False} - + # friendly name has spaces + friendly_name = group_name.replace('_',' ') + if not re.match('^[\w-]+$', group_name) is not None: res['code'] = msg_code['INCORRECT_GROUP_NAME'] @@ -274,7 +276,7 @@ def create_group(group_name, group_desc, public, attach, send_rejected, store_re res['code'] = msg_code['DUPLICATE_ERROR'] except Group.DoesNotExist: - group = Group(name=group_name, active=True, public=public, allow_attachments=attach, send_rejected_tagged=send_rejected, + group = Group(name=group_name, friendly_name=friendly_name, active=True, public=public, allow_attachments=attach, send_rejected_tagged=send_rejected, show_rejected_site=store_rejected, description=group_desc, mod_rules=mod_rules, mod_edit_wl_bl=mod_edit_wl_bl, auto_approve_after_first=auto_approve) group.save() diff --git a/http_handler/static/javascript/create_group.js b/http_handler/static/javascript/create_group.js index 7e6f71c8..4bae2112 100644 --- a/http_handler/static/javascript/create_group.js +++ b/http_handler/static/javascript/create_group.js @@ -6,7 +6,7 @@ $(document).ready(function() { btn_create_group.click(function() { var params = { - 'group_name' : $("#group-name").val(), + 'group_name' : $("#group-name").val().replaceAll(' ','_'), 'group_desc' : $("#group-description").val(), 'send_rejected_tagged' : true, 'store_rejected' : true, diff --git a/schema/models.py b/schema/models.py index cf132a31..825a6191 100644 --- a/schema/models.py +++ b/schema/models.py @@ -210,7 +210,10 @@ def __unicode__(self): class Group(models.Model): id = models.AutoField(primary_key=True) + # if the user inputs a name with spaces, this name attribute will replace the spaces with underscores name = models.CharField(max_length=20, unique=True) + # if the user inputs a name with spaces, this friendly_name attribute will have the spaces + friendly_name = models.CharField(default='',max_length=20) description = models.CharField(max_length=140) public = models.BooleanField(default=True) active = models.BooleanField(default=True) From 04ac6878971c854ccfa225be18f0c08f83da2554 Mon Sep 17 00:00:00 2001 From: angcast Date: Wed, 11 Nov 2020 10:24:51 -0500 Subject: [PATCH 19/44] Fixed edit group section --- browser/templates/murmur/group_page.html | 11 +++++++++-- http_handler/static/javascript/murmur/group_page.js | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/browser/templates/murmur/group_page.html b/browser/templates/murmur/group_page.html index fea7e34d..164bb532 100644 --- a/browser/templates/murmur/group_page.html +++ b/browser/templates/murmur/group_page.html @@ -5,7 +5,7 @@ {% block content %}
- + {% if group_info.subscribed %} Member {% else %} @@ -24,7 +24,14 @@ {% endif %} -

{{ group_info.group.name }}

+

+ {% if group_info.group.friendly_name == "" %} + {{ group_info.group.name }} + {% else %} + {{ group_info.group.friendly_name }} + {% endif %} +

+
{% if group_info.group.description == "" %} No description diff --git a/http_handler/static/javascript/murmur/group_page.js b/http_handler/static/javascript/murmur/group_page.js index 97a2f58a..27bf1c4b 100644 --- a/http_handler/static/javascript/murmur/group_page.js +++ b/http_handler/static/javascript/murmur/group_page.js @@ -1,7 +1,7 @@ $(document).ready(function(){ var user_name = $.trim($('#user_email').text()), - group_name = $.trim($("#group-name").text()), + group_name = $.trim($("#friendly-name").text().replaceAll(' ','_')), member = $.trim($(".member").text()) == "Member", admin = $.trim($(".admin").text()) == "Admin", mod = $.trim($(".mod").text()) == "Mod", From 809f840b64918d28a872c82bfe8f84f72887b3a7 Mon Sep 17 00:00:00 2001 From: angcast Date: Wed, 9 Dec 2020 15:26:21 -0500 Subject: [PATCH 20/44] creating the friendly name for a group --- browser/templates/mobile_list_groups.html | 6 ++- browser/templates/murmur/add_donotsend.html | 6 ++- browser/templates/murmur/add_list.html | 13 +++-- browser/templates/murmur/add_members.html | 8 ++- browser/templates/murmur/base.html | 24 ++++++--- browser/templates/murmur/create_post.html | 9 ++-- .../templates/murmur/edit_create_group.html | 9 +++- .../templates/murmur/edit_my_settings.html | 7 ++- browser/templates/murmur/group_page.html | 4 +- .../templates/murmur/mobile_list_posts.html | 8 ++- browser/templates/murmur/thread.html | 2 +- browser/views.py | 49 +++++++++++-------- engine/constants.py | 2 +- engine/main.py | 18 ++++--- .../static/javascript/add_donotsend.js | 2 +- http_handler/static/javascript/add_members.js | 2 +- .../static/javascript/edit_group_info.js | 3 +- .../static/javascript/murmur/add_list.js | 2 +- .../static/javascript/murmur/create_post.js | 3 +- .../static/javascript/murmur/group_page.js | 2 +- .../javascript/murmur/my_group_settings.js | 2 +- 21 files changed, 121 insertions(+), 60 deletions(-) diff --git a/browser/templates/mobile_list_groups.html b/browser/templates/mobile_list_groups.html index 81bdf629..8bc255e7 100644 --- a/browser/templates/mobile_list_groups.html +++ b/browser/templates/mobile_list_groups.html @@ -26,7 +26,11 @@

My {{ group_or_squad | title }}s

{% endif %}
  • - {{ group.name }} + {% if group.friendly_name != "" %} + {{ group.friendly_name }} + {% else %} + {{ group.name }} + {% endif %} {% if group.admin %} {% if website == 'murmur' %} diff --git a/browser/templates/murmur/add_donotsend.html b/browser/templates/murmur/add_donotsend.html index 70b7550c..7cd76d98 100644 --- a/browser/templates/murmur/add_donotsend.html +++ b/browser/templates/murmur/add_donotsend.html @@ -2,7 +2,11 @@ {% block container-content %} -

    Add email addresses to do-not-send for {{ group_info.name }}

    + {% if group_info.friendly_name != '' %} +

    Add email addresses to do-not-send for {{ group_info.friendly_name }}

    + {% else %} +

    Add email addresses to do-not-send for {{ group_info.name }}

    + {% endif %}
    diff --git a/browser/templates/murmur/add_list.html b/browser/templates/murmur/add_list.html index b5246118..796c25ae 100644 --- a/browser/templates/murmur/add_list.html +++ b/browser/templates/murmur/add_list.html @@ -8,17 +8,20 @@
    -

    Add New Associated Mailing List to {{ group_info.name }}

    - -
    + {% if group_info.friendly_name != '' %} +

    Add New Associated Mailing List to {{ group_info.friendly_name }}

    + {% else %} +

    Add New Associated Mailing List to {{ group_info.name }}

    + {% endif %} +
    List email address:

    List URL (optional):


    - Allow emails from the above mailing list to be posted to {{ group_info.name }}
    - Forward posts from {{ group_info.name }} to the above mailing list
    + Allow emails from the above mailing list to be posted to {{ group_info.friendly_name }}
    + Forward posts from {{ group_info.friendly_name }} to the above mailing list


    diff --git a/browser/templates/murmur/add_members.html b/browser/templates/murmur/add_members.html index a071147e..ed8bbd38 100644 --- a/browser/templates/murmur/add_members.html +++ b/browser/templates/murmur/add_members.html @@ -1,7 +1,13 @@ {% extends "group_container_base.html" %} {% block container-content %} -

    Add New Members to {{ group_info.name }}

    +

    Add New Members to + {% if group_info.friendly_name != '' %} + {{ group_info.friendly_name }} + {%else%} + {{ group_info.name }} + {%endif%} +


    diff --git a/browser/templates/murmur/base.html b/browser/templates/murmur/base.html index 795f6025..308c3447 100644 --- a/browser/templates/murmur/base.html +++ b/browser/templates/murmur/base.html @@ -58,10 +58,18 @@ {% if not group_page %}