2 from django.db import DatabaseError, transaction
3 from django.utils.html import linebreaks
5 from quotes.models import QuoteTag, Quote, Work, Author
7 def get_or_create_author(authorname, resultcontext):
8 authorname = authorname.strip()
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]
17 def get_or_create_work(workname, author, resultcontext):
18 workname = workname.strip()
20 return Work.objects.get(name=workname, author=author)
21 except Work.DoesNotExist:
22 w = Work.objects.create(name=workname,
24 pvt_notes="<p>Created during mass import</p>")
25 resultcontext["created_works"] += [w]
28 def get_or_create_tag(tagname, resultcontext):
30 return QuoteTag.objects.get(tag=tagname)
31 except QuoteTag.DoesNotExist:
32 t = QuoteTag.objects.create(tag=tagname)
33 resultcontext["created_tags"] += [t]
36 def add_tags_on_quote(quote, tagline, resultcontext):
37 for tagname in tagline.split(","):
38 tagname = tagname.strip()
41 tag = get_or_create_tag(tagname, resultcontext)
44 def paragraphize(text):
46 return linebreaks(text)
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]
56 def create_all_quotes(allquotes, resultcontext):
57 quotesep = re.compile(r'^\s*===+.*$', re.MULTILINE)
58 elemsep = re.compile(r'^\s*---+.*$', re.MULTILINE)
60 for fullquote in quotesep.split(allquotes):
61 if not fullquote: continue
63 elements = elemsep.split(fullquote)
64 if len(elements) not in [3, 4]:
65 resultcontext["rejected"] += [fullquote]
67 quotetext, authorname, workname = elements[0:3]
68 if len(elements) == 4:
72 create_quote(quotetext, authorname, workname, tagline,
75 def domassimport(allquotes):
77 resultcontext["created_quotes"] = []
78 resultcontext["created_tags"] = []
79 resultcontext["created_works"] = []
80 resultcontext["created_authors"] = []
81 resultcontext["rejected"] = []
82 resultcontext["fatal_error"] = False
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__