aboutsummaryrefslogtreecommitdiffstats
path: root/notes
diff options
context:
space:
mode:
Diffstat (limited to 'notes')
-rw-r--r--notes/__init__.py0
-rw-r--r--notes/models.py63
-rw-r--r--notes/templates/edit.html31
-rw-r--r--notes/templates/index.html27
-rw-r--r--notes/templates/view.html15
-rw-r--r--notes/tests.py16
-rw-r--r--notes/views.py51
7 files changed, 203 insertions, 0 deletions
diff --git a/notes/__init__.py b/notes/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/notes/__init__.py
diff --git a/notes/models.py b/notes/models.py
new file mode 100644
index 0000000..2cd5ca6
--- /dev/null
+++ b/notes/models.py
@@ -0,0 +1,63 @@
+import re
+from datetime import datetime
+from django.db import models
+from django.contrib.auth.models import User
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+
+class Tag(models.Model):
+ title = models.CharField(max_length=128)
+
+ class Meta:
+ ordering = ['title']
+
+class Note(models.Model):
+ user = models.ForeignKey(User)
+ shared = models.BooleanField(default=True)
+ title = models.CharField(max_length=140, null=True)
+ tags = models.ManyToManyField(Tag, null=True, blank=True)
+
+ def get_date(self):
+ return self.version_set.all()[0].created_at
+
+ def get_user(self):
+ pass
+
+ def content(self):
+ try:
+ return self.version_set.latest().content
+ except Version.DoesNotExist:
+ return ''
+
+ def updated_at(self):
+ return self.version_set.latest().created_at
+
+ def get_absolute_url(self):
+ return '/notes/%d/' % self.pk
+
+ class Meta:
+ ordering = ['-id']
+
+class Version(models.Model):
+ note = models.ForeignKey(Note)
+ user = models.ForeignKey(User)
+ content = models.TextField()
+ created_at = models.DateTimeField(default=datetime.now())
+
+ class Meta:
+ get_latest_by = 'created_at'
+
+class Attachment(models.Model):
+ content = models.FileField(upload_to='uploads')
+ note = models.ForeignKey(Note)
+
+@receiver(post_save, sender=Version)
+def version_saved(sender, instance, created, **kwargs):
+
+ tags = re.findall('#(\w+)', instance.content)
+
+ for t in tags:
+ tag = Tag.objects.get_or_create(title=t)[0]
+ instance.note.tags.add(tag)
+
+ instance.note.save()
diff --git a/notes/templates/edit.html b/notes/templates/edit.html
new file mode 100644
index 0000000..6d2ec1e
--- /dev/null
+++ b/notes/templates/edit.html
@@ -0,0 +1,31 @@
+{% extends request.is_ajax|yesno:"blank.html,index.html" %}
+
+{% block content %}
+<div data-role="page">
+ <div data-role="header">
+ <a href="/notes/" data-icon="arrow-l">Notes</a>
+ <h1>New Note</h1>
+ <a href="/notes/" id="done">Done</a>
+ </div>
+ <div data-role="content">
+ <form action="" method="post" id="noteForm" enctype="multipart/form-data">
+ {% csrf_token %}
+ {{ form }}
+ <button type="submit" data-theme="b">Save</button>
+ {% if form.is_bound %}
+ <a href="delete/" data-role="button">Delete</a>
+ {% endif %}
+ </form>
+ </div>
+</div>
+
+<script type="text/javascript">
+ $(function(){
+ $('#id_title').focus();
+ });
+ $('#done').click(function(e){
+ e.preventDefault();
+ $('#noteForm').submit();
+ });
+</script>
+{% endblock content %}
diff --git a/notes/templates/index.html b/notes/templates/index.html
new file mode 100644
index 0000000..c996511
--- /dev/null
+++ b/notes/templates/index.html
@@ -0,0 +1,27 @@
+{% extends request.is_ajax|yesno:"blank.html,default.html" %}
+
+{% block content %}
+<div data-role="page">
+ <div data-role="header" data-position="fixed">
+ <a href="#tagPopup" data-icon="gear" data-rel="popup">Tags</a>
+ <h1>Notes</h1>
+ <a href="/notes/new/" class="ui-btn-right">New</a>
+ </div>
+ <div data-role="content">
+ <ul data-role="listview" data-filter="true">
+ {% for n in notes %}
+ <li><a href="{{ n.get_absolute_url }}">{{ n.title }}<p class="ui-li-aside ui-li-desc">{{ n.user.username }} @ {{ n.updated_at|date:"SHORT_DATE_FORMAT" }}</p></a></li>
+ {% endfor %}
+ </ul>
+
+ <div data-role="popup" id="tagPopup">
+ <ul data-role="listview" data-inset="true">
+ {% for t in tags %}
+ <li><a href="/notes/tag/{{ t.pk }}/">{{ t.title }} <span class="ui-li-count">{{ t.note_set.count }}</span></a></li>
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+</div>
+
+{% endblock content %}
diff --git a/notes/templates/view.html b/notes/templates/view.html
new file mode 100644
index 0000000..a6d3473
--- /dev/null
+++ b/notes/templates/view.html
@@ -0,0 +1,15 @@
+{% extends request.is_ajax|yesno:"blank.html,index.html" %}
+{% load markup %}
+
+{% block content %}
+<div data-role="page">
+ <div data-role="header">
+ <a href="/notes/" data-icon="arrow-l">Notes</a>
+ <h1>{{ note.title }}</h1>
+ <a href="{{ note.get_absolute_url }}edit/">Edit</a>
+ </div>
+ <div data-role="content">
+ <p>{{ version.content|restructuredtext }}</p>
+ </div>
+</div>
+{% endblock content %}
diff --git a/notes/tests.py b/notes/tests.py
new file mode 100644
index 0000000..501deb7
--- /dev/null
+++ b/notes/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+ def test_basic_addition(self):
+ """
+ Tests that 1 + 1 always equals 2.
+ """
+ self.assertEqual(1 + 1, 2)
diff --git a/notes/views.py b/notes/views.py
new file mode 100644
index 0000000..386b0c0
--- /dev/null
+++ b/notes/views.py
@@ -0,0 +1,51 @@
+from django import forms
+from django.shortcuts import render, redirect
+from notes.models import Note, Attachment, Tag, Version
+
+class NoteForm(forms.Form):
+ title = forms.CharField()
+ content = forms.CharField(widget=forms.Textarea(attrs={'rows': 20,
+ 'style': 'width:100%;height:100%'}))
+ shared = forms.BooleanField()
+ attachment = forms.FileField(required=False)
+
+def edit(request, note_id=None):
+
+ note = Note(user_id=1)
+
+ if note_id:
+ note = Note.objects.get(pk=note_id)
+
+ if request.method == 'POST':
+ form = NoteForm(request.POST, request.FILES)
+
+ if not form.is_valid():
+ return render(request, 'edit.html', {'form': form})
+
+ note.title = form.cleaned_data.get('title')
+ note.save()
+
+ version = Version(note=note, user_id=1)
+ version.content = form.cleaned_data.get('content')
+ version.shared = form.cleaned_data.get('shared')
+ version.save()
+
+ return render(request, 'view.html', {'note': note, 'version': version})
+
+ form = NoteForm(initial={'content': note.content, 'shared': note.shared})
+
+ return render(request, 'edit.html', {'form': form})
+
+def index(request, tag_id=None):
+ notes = Note.objects.filter(user_id=1)
+
+ if tag_id:
+ notes = notes.filter(tags__pk=tag_id)
+
+ tags = Tag.objects.distinct()
+ return render(request, 'index.html', {'notes': notes, 'tags': tags})
+
+def view(request, note_id):
+ note = Note.objects.get(pk=note_id)
+ version = note.version_set.latest()
+ return render(request, 'view.html', {'note': note, 'version': version})