Skip to content

Commit

Permalink
Refs #720 -- Added bio/website fields for DSF members.
Browse files Browse the repository at this point in the history
  • Loading branch information
timgraham authored Feb 25, 2017
1 parent 5139cfb commit c3128f1
Show file tree
Hide file tree
Showing 12 changed files with 105 additions and 3 deletions.
1 change: 1 addition & 0 deletions djangoproject/settings/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@

'registration',
'django_hosts',
'markdownx',
'sorl.thumbnail',

'django.contrib.sites',
Expand Down
5 changes: 3 additions & 2 deletions djangoproject/templates/members/individualmember_list.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{% extends "base_foundation.html" %}
{% load i18n %}
{% load i18n markdown %}

{% block content %}
<h1>{% trans "Individual members" %}</h1>
Expand All @@ -13,7 +13,8 @@ <h1>{% trans "Individual members" %}</h1>
</p>
<ul>
{% for member in members %}
<li>{{ member.name }}</li>
<li>{{ member.linked_name }}
{{ member.bio|markdownify }}</li>
{% endfor %}
</ul>

Expand Down
20 changes: 20 additions & 0 deletions djangoproject/test_markdownx.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.contrib.auth.models import User
from django.test import TestCase


class TestPermissions(TestCase):
url = '/markdownx/markdownify/'

def test_anonymous(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)

def test_staff_required(self):
user = User.objects.create(username='test')
self.client.force_login(user)
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)
user.is_staff = True
user.save()
response = self.client.get(self.url)
self.assertEqual(response.status_code, 405)
3 changes: 3 additions & 0 deletions djangoproject/urls/www.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from django.conf import settings
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth import views as auth_views
from django.contrib.contenttypes import views as contenttypes_views
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps import views as sitemap_views
from django.views.decorators.cache import cache_page
from django.views.generic import RedirectView, TemplateView
from django.views.static import serve
from markdownx.views import MarkdownifyView

from accounts import views as account_views
from aggregator.feeds import (
Expand Down Expand Up @@ -53,6 +55,7 @@
url(r'^contact/', include('contact.urls')),
url(r'^foundation/', include('members.urls')),
url(r'^fundraising/', include('fundraising.urls')),
url(r'^markdownx/markdownify/$', staff_member_required(MarkdownifyView.as_view())),

# Used by docs search suggestions
url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.*)/$', contenttypes_views.shortcut, name='contenttypes-shortcut'),
Expand Down
3 changes: 2 additions & 1 deletion members/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
from django.templatetags.static import static
from django.utils.formats import localize
from django.utils.html import format_html
from markdownx.admin import MarkdownxModelAdmin

from members.models import CorporateMember, IndividualMember, Invoice, Team


@admin.register(IndividualMember)
class IndividualMemberAdmin(admin.ModelAdmin):
class IndividualMemberAdmin(MarkdownxModelAdmin):
list_display = [
'name',
'email',
Expand Down
26 changes: 26 additions & 0 deletions members/migrations/0007_auto_20170216_0837.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-02-16 08:37
from __future__ import unicode_literals

import markdownx.models
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('members', '0006_team'),
]

operations = [
migrations.AddField(
model_name='individualmember',
name='bio',
field=markdownx.models.MarkdownxField(blank=True),
),
migrations.AddField(
model_name='individualmember',
name='website',
field=models.URLField(blank=True),
),
]
10 changes: 10 additions & 0 deletions members/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.html import format_html
from django.views.generic.dates import timezone_today
from django_hosts import reverse
from markdownx.models import MarkdownxField
from sorl.thumbnail import ImageField, get_thumbnail

BRONZE_MEMBERSHIP = 1
Expand Down Expand Up @@ -39,6 +41,8 @@ class IndividualMember(models.Model):
member_since = models.DateField(default=timezone_today)
member_until = models.DateField(null=True, blank=True)
reason_for_leaving = models.TextField(blank=True)
bio = MarkdownxField(blank=True)
website = models.URLField(blank=True)

class Meta:
ordering = ['name']
Expand All @@ -50,6 +54,12 @@ def __str__(self):
def is_active(self):
return self.member_until is None

@property
def linked_name(self):
if self.website:
return format_html('<a href="{}">{}</a>', self.website, self.name)
return self.name


class Team(models.Model):
name = models.CharField(max_length=250)
Expand Down
Empty file.
16 changes: 16 additions & 0 deletions members/templatetags/markdown.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import bleach
import markdown
from django import template
from django.utils.safestring import mark_safe

register = template.Library()


@register.filter(is_safe=True)
def markdownify(text):
return mark_safe(
bleach.clean(
markdown.markdown(text, output_format='html5'),
tags=('a', 'abbr', 'acronym', 'b', 'blockquote', 'em', 'i', 'li', 'ol', 'p', 'strong', 'ul'),
)
)
7 changes: 7 additions & 0 deletions members/test_models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from datetime import date, timedelta

from django.test import TestCase
from django.utils.safestring import SafeData

from members.models import (
GOLD_MEMBERSHIP, PLATINUM_MEMBERSHIP, SILVER_MEMBERSHIP, CorporateMember,
Expand All @@ -23,6 +24,12 @@ def setUp(self):
def test_str(self):
self.assertEqual(str(self.member), 'DjangoDeveloper')

def test_linked_name(self):
self.assertEqual(self.member.linked_name, 'DjangoDeveloper')
self.member.website = 'djangoproject.com'
self.assertEqual(self.member.linked_name, '<a href="djangoproject.com">DjangoDeveloper</a>')
self.assertIsInstance(self.member.linked_name, SafeData)

def test_member_since_should_have_default(self):
self.assertEqual(IndividualMember().member_since, date.today())

Expand Down
14 changes: 14 additions & 0 deletions members/test_templatetags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.test import SimpleTestCase
from django.utils.safestring import SafeData

from .templatetags.markdown import markdownify


class MarkdownifyTests(SimpleTestCase):
def test_str(self):
result = markdownify('Line\n\n[Link](https://www.djangoproject.com)')
self.assertEqual(
result,
'<p>Line</p>\n<p><a href="https://www.djangoproject.com">Link</a></p>',
)
self.assertIsInstance(result, SafeData)
3 changes: 3 additions & 0 deletions requirements/common.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
bleach==1.5.0
certifi==2017.1.23
Django==1.10.5
django-contact-form==1.3
django-hosts==2.0
django-markdownx==1.7.2
django-push==0.9
django-registration-redux==1.4
elasticsearch-dsl==5.1.0
Expand All @@ -10,6 +12,7 @@ docutils==0.13.1
feedparser==5.2.1
Jinja2==2.9.5
libsass==0.12.3
Markdown==2.6.8
Pillow==4.0.0
psycopg2==2.6.2
pygments==2.2.0
Expand Down

0 comments on commit c3128f1

Please sign in to comment.