contacts: Remove ContactEntry and add Unsubscription
This change removes the unused `ContactEntry` model and the `subscribe` view and replaces it with an `Unsubscription` model and an `unsubscribe` view. It works similarly, but is intended to be used with the `list-unsubscribe` and `list-unsubscribe-post` headers.
This commit is contained in:
		
							parent
							
								
									ef3dd503d8
								
							
						
					
					
						commit
						789d0c8c84
					
				
					 10 changed files with 86 additions and 33 deletions
				
			
		|  | @ -1,10 +1,8 @@ | |||
| from django.contrib import admin | ||||
| 
 | ||||
| from .models import ContactEntry | ||||
| 
 | ||||
| 
 | ||||
| @admin.register(ContactEntry) | ||||
| class ContactEntryAdmin(admin.ModelAdmin): | ||||
|     list_display = ('email', 'subscribe_conservancy') | ||||
| from .models import Unsubscription | ||||
| 
 | ||||
| 
 | ||||
| @admin.register(Unsubscription) | ||||
| class UnsubscriptionAdmin(admin.ModelAdmin): | ||||
|     list_display = ['created', 'email'] | ||||
|  |  | |||
							
								
								
									
										32
									
								
								conservancy/contacts/migrations/0001_initial.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								conservancy/contacts/migrations/0001_initial.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| # Generated by Django 4.2.11 on 2024-04-09 08:01 | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     initial = True | ||||
| 
 | ||||
|     dependencies = [] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.CreateModel( | ||||
|             name='Unsubscription', | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     'id', | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name='ID', | ||||
|                     ), | ||||
|                 ), | ||||
|                 ('created', models.DateTimeField(auto_now_add=True)), | ||||
|                 ('email', models.EmailField(max_length=254)), | ||||
|             ], | ||||
|             options={ | ||||
|                 'ordering': ['created'], | ||||
|             }, | ||||
|         ), | ||||
|     ] | ||||
							
								
								
									
										0
									
								
								conservancy/contacts/migrations/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								conservancy/contacts/migrations/__init__.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -1,14 +1,9 @@ | |||
| from django.db import models | ||||
| 
 | ||||
| 
 | ||||
| class ContactEntry(models.Model): | ||||
|     """Conservancy contact system | ||||
| 
 | ||||
|     Hopefully this will be deprecated soon""" | ||||
| 
 | ||||
|     email = models.EmailField() # should make it unique, but we really cannot | ||||
|     subscribe_conservancy = models.BooleanField(default=False) | ||||
| class Unsubscription(models.Model): | ||||
|     created = models.DateTimeField(auto_now_add=True, blank=True) | ||||
|     email = models.EmailField() | ||||
| 
 | ||||
|     class Meta: | ||||
|         ordering = ('email',) | ||||
| 
 | ||||
|         ordering = ['created'] | ||||
|  |  | |||
							
								
								
									
										10
									
								
								conservancy/contacts/templates/contacts/unsubscribe.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								conservancy/contacts/templates/contacts/unsubscribe.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| {% extends "base_conservancy.html" %} | ||||
| {% block outercontent %} | ||||
|   <div class="mw8 center ph2 ph3 mb4"> | ||||
|     <h1>Unsubscribe</h1> | ||||
|     <form action="." method="post"> | ||||
|       {{ form.as_p }} | ||||
|       <p><button type="submit" class="ph3 pv2">Submit</button></p> | ||||
|     </form> | ||||
|   </div> | ||||
| {% endblock %} | ||||
|  | @ -0,0 +1,6 @@ | |||
| {% extends "base_conservancy.html" %} | ||||
| {% block outercontent %} | ||||
|   <div class="mw8 center ph2 ph3 mb4"> | ||||
|     <h1>Unsubscribe successful</h1> | ||||
|   </div> | ||||
| {% endblock %} | ||||
|  | @ -1,7 +1,7 @@ | |||
| from django.urls import path | ||||
| 
 | ||||
| from .views import subscribe | ||||
| from .views import unsubscribe | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     path('', subscribe), | ||||
|     path('unsubscribe/', unsubscribe), | ||||
| ] | ||||
|  |  | |||
|  | @ -1,25 +1,31 @@ | |||
| import logging | ||||
| 
 | ||||
| from django.forms import ModelForm | ||||
| from django.views.decorators.csrf import csrf_exempt | ||||
| from django.shortcuts import render | ||||
| 
 | ||||
| from .models import ContactEntry | ||||
| from .models import Unsubscription | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
| 
 | ||||
| class UnsubscribeForm(ModelForm): | ||||
|     class Meta: | ||||
|         model = Unsubscription | ||||
|         fields = ['email'] | ||||
| 
 | ||||
| 
 | ||||
| def subscribe(request): | ||||
|     """Mailing list subscription form | ||||
|     """ | ||||
| 
 | ||||
|     class ContactEntryForm(ModelForm): | ||||
|         class Meta: | ||||
|             model = ContactEntry | ||||
| 
 | ||||
|     ContactEntryForm.base_fields['subscribe_conservancy'].label = 'Receive Software Freedom Conservancy updates' | ||||
| 
 | ||||
| # Exempt from CSRF protection so that it can be triggered by Gmail's on-click | ||||
| # unsubscribe. | ||||
| @csrf_exempt | ||||
| def unsubscribe(request): | ||||
|     if request.method == 'POST': | ||||
|         form = ContactEntryForm(request.POST) | ||||
|         logger.debug('Unsubscribe GET: %s', request.GET) | ||||
|         logger.debug('Unsubscribe POST: %s', request.POST) | ||||
|         form = UnsubscribeForm(request.POST) | ||||
|         if form.is_valid(): | ||||
|             form.save() | ||||
|             return render(request, 'contacts/subscribe_success.html', {'form': form.cleaned_data}) | ||||
|             logger.info('Unsubscribed %s', form.cleaned_data['email']) | ||||
|             return render(request, 'contacts/unsubscribe_success.html') | ||||
|     else: | ||||
|         form = ContactEntryForm() | ||||
| 
 | ||||
|     return render(request, 'contacts/subscribe.html', {'form': form}) | ||||
|         form = UnsubscribeForm() | ||||
|     return render(request, 'contacts/unsubscribe.html', {'form': form}) | ||||
|  |  | |||
|  | @ -59,6 +59,11 @@ LOGGING = { | |||
|             'handlers': ['console'], | ||||
|             'propagate': False, | ||||
|         }, | ||||
|         'conservancy.contacts': { | ||||
|             'handlers': ['console'], | ||||
|             'level': 'DEBUG', | ||||
|             'propagate': False, | ||||
|         } | ||||
|     }, | ||||
|     'root': { | ||||
|         'handlers': ['console'], | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ urlpatterns = [ | |||
|     path('assignment/', include('conservancy.assignment.urls')), | ||||
|     path('blog/', include('conservancy.blog.urls')), | ||||
|     path('casts/the-corresponding-source/', include('conservancy.podjango.urls')), | ||||
|     path('contacts/', include('conservancy.contacts.urls')), | ||||
|     path('contractpatch/', include('conservancy.contractpatch.urls')), | ||||
|     path('feeds/', feeds.view), | ||||
|     path('feeds/blog/', feeds.BlogFeed()), | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue