diff options
-rw-r--r-- | app/people/__init__.py | 0 | ||||
-rw-r--r-- | app/people/admin.py | 8 | ||||
-rw-r--r-- | app/people/build.py | 35 | ||||
-rw-r--r-- | app/people/migrations/0001_initial.py | 42 | ||||
-rw-r--r-- | app/people/migrations/__init__.py | 0 | ||||
-rw-r--r-- | app/people/models.py | 54 | ||||
-rw-r--r-- | app/people/urls.py | 36 | ||||
-rw-r--r-- | app/people/views.py | 38 | ||||
-rw-r--r-- | config/base_urls.py | 1 | ||||
-rw-r--r-- | design/templates/archives/people.html | 34 |
10 files changed, 248 insertions, 0 deletions
diff --git a/app/people/__init__.py b/app/people/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/people/__init__.py diff --git a/app/people/admin.py b/app/people/admin.py new file mode 100644 index 0000000..ea0b463 --- /dev/null +++ b/app/people/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from .models import Person + + +@admin.register(Person) +class PersonAdmin(admin.ModelAdmin): + list_display = ('last_name', 'first_name', 'location_met', ) + diff --git a/app/people/build.py b/app/people/build.py new file mode 100644 index 0000000..35fdb19 --- /dev/null +++ b/app/people/build.py @@ -0,0 +1,35 @@ +import os +from django.urls import reverse +from builder.base import BuildNew + + +class BuildBooks(BuildNew): + + def build(self): + self.build_detail_view() + self.build_list_view( + base_path=reverse("books:live_redirect"), + paginate_by=24 + ) + print("building books") + + def get_model_queryset(self): + return self.model.objects.all() + + def build_detail_view(self): + ''' + write out all the expenses for each trip + ''' + for obj in self.get_model_queryset(): + url = obj.get_absolute_url() + path, slug = os.path.split(url) + path = '%s/' % path + # write html + response = self.client.get(url) + print(path, slug) + self.write_file(path, response.content, filename=slug) + + +def builder(): + j = BuildBooks("books", "book") + j.build() diff --git a/app/people/migrations/0001_initial.py b/app/people/migrations/0001_initial.py new file mode 100644 index 0000000..9174f3f --- /dev/null +++ b/app/people/migrations/0001_initial.py @@ -0,0 +1,42 @@ +# Generated by Django 2.0.1 on 2018-03-07 10:27 + +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('locations', '0003_auto_20180307_1027'), + ('taggit', '0002_auto_20150616_2121'), + ] + + operations = [ + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=200)), + ('last_name', models.CharField(max_length=200)), + ('email', models.EmailField(blank=True, max_length=120, null=True)), + ('street', models.CharField(blank=True, max_length=355, null=True)), + ('city', models.CharField(blank=True, max_length=200, null=True)), + ('state', models.CharField(blank=True, max_length=200, null=True)), + ('postal_code', models.CharField(blank=True, max_length=20, null=True)), + ('country', models.CharField(max_length=200, null=True)), + ('phone', models.CharField(blank=True, max_length=22, null=True)), + ('slug', models.CharField(max_length=50)), + ('body_markdown', models.TextField(blank=True, null=True)), + ('body_html', models.TextField(blank=True, null=True)), + ('next_contact_date', models.DateField(blank=True, null=True)), + ('location_met', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='locations.Location')), + ('tags', taggit.managers.TaggableManager(blank=True, help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags')), + ], + options={ + 'ordering': ('-last_name',), + }, + ), + ] diff --git a/app/people/migrations/__init__.py b/app/people/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/people/migrations/__init__.py diff --git a/app/people/models.py b/app/people/models.py new file mode 100644 index 0000000..b4bc2cc --- /dev/null +++ b/app/people/models.py @@ -0,0 +1,54 @@ +from django.db import models +from django.template.defaultfilters import slugify + +from taggit.managers import TaggableManager +from locations.models import Location +from utils.widgets import markdown_to_html + + +class Person(models.Model): + first_name = models.CharField(max_length=200) + last_name = models.CharField(max_length=200) + email = models.EmailField(max_length=120, null=True, blank=True) + street = models.CharField(max_length=355, null=True, blank=True) + city = models.CharField(max_length=200, null=True, blank=True) + state = models.CharField(max_length=200, null=True, blank=True) + postal_code = models.CharField(max_length=20, null=True, blank=True) + country = models.CharField(max_length=200, null=True) + phone = models.CharField(max_length=22, blank=True, null=True) + slug = models.CharField(max_length=50, blank=True) + body_markdown = models.TextField(null=True, blank=True) + body_html = models.TextField(null=True, blank=True) + tags = TaggableManager(blank=True) + location_met = models.ForeignKey(Location, on_delete=models.CASCADE, null=True, blank=True) + next_contact_date = models.DateField(null=True, blank=True) + + class Meta: + ordering = ('-last_name',) + + def __str__(self): + return "%s %s" %(self.first_name, self.last_name) + + def get_absolute_url(self): + return reverse("people:detail", kwargs={"slug": self.slug}) + + @property + def get_previous_admin_url(self): + n = self.get_previous_by_pub_date() + return reverse('admin:%s_%s_change' %(self._meta.app_label, self._meta.model_name), args=[n.id] ) + + @property + def get_next_admin_url(self): + model = apps.get_model(app_label=self._meta.app_label, model_name=self._meta.model_name) + try: + return reverse('admin:%s_%s_change' %(self._meta.app_label, self._meta.model_name), args=[self.get_next_by_pub_date().pk] ) + except model.DoesNotExist: + return '' + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(("%s-%s")[:50] %(self.last_name, self.first_name)) + if self.body_markdown: + self.body_html = markdown_to_html(self.body_markdown) + super(Person, self).save() + diff --git a/app/people/urls.py b/app/people/urls.py new file mode 100644 index 0000000..0ae38eb --- /dev/null +++ b/app/people/urls.py @@ -0,0 +1,36 @@ +from django.urls import path, re_path +from django.views.generic.base import RedirectView + +from . import views + +app_name = "people" + +urlpatterns = [ + re_path( + r'^tag/(?P<slug>[-\w]+)/$', + views.PersonTagListView.as_view(), + {'page':1}, + name='list-tag' + ), + re_path( + r'tag/(?P<slug>[-\w]+)/(?P<page>\d+)/$', + views.PersonTagListView.as_view(), + name='list-tag' + ), + re_path( + r'^(?P<page>\d+)/$', + views.PersonListView.as_view(), + name="list" + ), + path( + r'', + views.PersonListView.as_view(), + {'page':1}, + name="list" + ), + path( + r'<str:slug>/', + views.PersonDetailView.as_view(), + name='detail', + ), +] diff --git a/app/people/views.py b/app/people/views.py new file mode 100644 index 0000000..36c0657 --- /dev/null +++ b/app/people/views.py @@ -0,0 +1,38 @@ +from django.views.generic.detail import DetailView +from utils.views import PaginatedListView + +from taggit.models import Tag +from .models import Person + + +class PersonListView(PaginatedListView): + model = Person + template_name = 'archives/people.html' + + def get_context_data(self, **kwargs): + # Call the base implementation first to get a context + context = super(PersonListView, self).get_context_data(**kwargs) + context['tags'] = Person.tags.all() + return context + + +class PersonDetailView(DetailView): + model = Person + template_name = "details/person.html" + slug_field = "slug" + + +class PersonTagListView(PaginatedListView): + model = Person + template_name = 'archives/people.html' + + def get_queryset(self): + print(self.kwargs['slug']) + return Person.objects.filter(tags__slug=self.kwargs['slug']) + + def get_context_data(self, **kwargs): + # Call the base implementation first to get a context + context = super(PersonTagListView, self).get_context_data(**kwargs) + context['tag'] = Tag.objects.get(slug__exact=self.kwargs['slug']) + context['tags'] = Person.tags.all() + return context diff --git a/config/base_urls.py b/config/base_urls.py index c0a2bfa..1e9b34f 100644 --- a/config/base_urls.py +++ b/config/base_urls.py @@ -45,6 +45,7 @@ urlpatterns = [ path(r'expenses/', include('expenses.urls', namespace='expenses')), path(r'photos/', include('photos.urls')), path(r'books/', include('books.urls')), + path(r'people/', include('people.urls')), path(r'sightings/', include('sightings.urls', namespace='sightings')), path(r'field-notes/', include('sketches.urls', namespace='sketches')), path(r'src/', include('src.urls', namespace='src')), diff --git a/design/templates/archives/people.html b/design/templates/archives/people.html new file mode 100644 index 0000000..533199a --- /dev/null +++ b/design/templates/archives/people.html @@ -0,0 +1,34 @@ +{% extends 'base.html' %} +{% load typogrify_tags %} +{% load pagination_tags %} +{% block pagetitle %} People | luxagraf {% endblock %} +{% block metadescription %} {% endblock %} +{%block bodyid%}class="links" id="people-archive"{%endblock%} + +{% block primary %} + <ul class="bl" id="breadcrumbs" itemscope itemtype="http://data-vocabulary.org/Breadcrumb"> + <li><a href="/" title="luxagraf homepage" itemprop="url"><span itemprop="title">Home</span></a> → </li> + {% if tag %}<li><a href="{% url "people:list"%}" title="all people" itemprop="url"><span itemprop="title">People</span></a> → </li><li>{{tag}}</li>{%else%}<li>People</li>{% endif%} + </ul> + <main role="main"> + <div class="tags"> + <ul class="tag-list">{% for object in tags %} + <li><a href="{% url "people:list-tag" object.slug %}">{{object.name}}</a></li>{%endfor%} + </ul> + </div> + {% autopaginate object_list 100 %}{% for object in object_list %} + <article> + <h4 class="link-title"> + <a href="{%url "people:detail" object.slug %}">{{object|smartypants|safe}}</a> + </h4> + <ul> + <li>Email: <a href="mailto:{{object.email}}">{{object.email}}</a></li> + <li>Tel: <a href="tel:{{object.phone}}">{{object.phone}}</a></li> + </ul> + </article> + {% endfor %} + </main> + <nav class="pagination"> + {% paginate %} + </nav> +{% endblock %} |