]> gitweb.fperrin.net Git - djsite.git/blob - quotes/massimport.py
Use Django's linebreaks method
[djsite.git] / quotes / massimport.py
1 import re
2 from django.db import DatabaseError, transaction
3 from django.utils.html import linebreaks
4
5 from quotes.models import QuoteTag, Quote, Work, Author
6
7 def get_or_create_author(authorname, resultcontext):
8     authorname = authorname.strip()
9     try:
10         return Author.objects.get(name=authorname)
11     except Author.DoesNotExist:
12         a = Author.objects.create(name=authorname,
13                                   pvt_notes="<p>Created during mass import</p>")
14         resultcontext["created_authors"] += [a]
15         return a
16
17 def get_or_create_work(workname, author, resultcontext):
18     workname = workname.strip()
19     try:
20         return Work.objects.get(name=workname, author=author)
21     except Work.DoesNotExist:
22         w = Work.objects.create(name=workname,
23                                 author=author,
24                                 pvt_notes="<p>Created during mass import</p>")
25         resultcontext["created_works"] += [w]
26         return w
27
28 def get_or_create_tag(tagname, resultcontext):
29     try:
30         return QuoteTag.objects.get(tag=tagname)
31     except QuoteTag.DoesNotExist:
32         t = QuoteTag.objects.create(tag=tagname)
33         resultcontext["created_tags"] += [t]
34         return t
35     
36 def add_tags_on_quote(quote, tagline, resultcontext):
37     for tagname in tagline.split(","):
38         tagname = tagname.strip()
39         if not tagname:
40             continue
41         tag = get_or_create_tag(tagname, resultcontext)
42         quote.tags.add(tag)
43
44 def paragraphize(text):
45     text = text.strip()
46     return linebreaks(text)
47         
48 def create_quote(quotetext, authorname, workname, tagline, resultcontext):
49     author = get_or_create_author(authorname, resultcontext)
50     work = get_or_create_work(workname, author, resultcontext)
51     quotetext = paragraphize(quotetext)
52     quote = Quote.objects.create(text=quotetext, work=work)
53     add_tags_on_quote(quote, tagline, resultcontext)
54     resultcontext["created_quotes"] += [quote]
55
56 def create_all_quotes(allquotes, resultcontext):
57     quotesep = re.compile(r'^\s*===+.*$', re.MULTILINE)
58     elemsep = re.compile(r'^\s*---+.*$', re.MULTILINE)
59     
60     for fullquote in quotesep.split(allquotes):
61         if not fullquote: continue
62
63         elements = elemsep.split(fullquote)
64         if len(elements) not in [3, 4]:
65             resultcontext["rejected"] += [fullquote]
66             continue
67         quotetext, authorname, workname = elements[0:3]
68         if len(elements) == 4:
69             tagline = elements[3]
70         else:
71             tagline = ''
72         create_quote(quotetext, authorname, workname, tagline,
73                      resultcontext)
74
75 def domassimport(allquotes):
76     resultcontext = {}
77     resultcontext["created_quotes"] = []
78     resultcontext["created_tags"] = []
79     resultcontext["created_works"] = []
80     resultcontext["created_authors"] = []
81     resultcontext["rejected"] = []
82     resultcontext["fatal_error"] = False
83
84     try:
85         with transaction.atomic():
86             create_all_quotes(allquotes, resultcontext)
87     except DatabaseError as e:
88         resultcontext["fatal_error"] = True
89         resultcontext["fatal_error_message"] = e.__cause__
90
91     return resultcontext