1- # Copyright The IETF Trust 2012 -2019, All Rights Reserved
1+ # Copyright The IETF Trust 2018 -2019, All Rights Reserved
22# -*- coding: utf-8 -*-
33
4-
54from __future__ import absolute_import , print_function , unicode_literals
65
6+ import datetime
77import io
8- import sys
98import os
9+ import re
10+ import sys
1011
11- from django .core .management .base import BaseCommand
1212from django .conf import settings
13+ from django .core .management .base import BaseCommand
1314from django .template .loader import render_to_string
1415
15- from ietf .doc .models import Document
16-
17- def write (fn , new ):
18- try :
19- f = io .open (fn )
20- old = f .read ().decode ('utf-8' )
21- f .close
22- except IOError :
23- old = ""
24- if old .strip () != new .strip ():
25- sys .stdout .write (os .path .basename (fn )+ '\n ' )
26- f = io .open (fn , "wb" )
27- f .write (new .encode ('utf-8' ))
28- f .close ()
16+ import debug # pyflakes:ignore
17+
18+ from ietf .doc .models import NewRevisionDocEvent
19+
20+ DEFAULT_DAYS = 7
2921
3022class Command (BaseCommand ):
31- help = ('Generate draft bibxml files, for xml2rfc references' )
23+ help = ('Generate draft bibxml files for xml2rfc references, placing them in the '
24+ 'directory configured in settings.BIBXML_BASE_PATH: %s. '
25+ 'By default, generate files as needed for new draft revisions from the '
26+ 'last %s days.' % (settings .BIBXML_BASE_PATH , DEFAULT_DAYS ))
27+
28+ def add_arguments (self , parser ):
29+ parser .add_argument ('--all' , action = 'store_true' , default = False , help = "Process all documents, not only recent submissions" )
30+ parser .add_argument ('--days' , type = int , default = DEFAULT_DAYS , help = "Look submissions from the last DAYS days, instead of %s" % DEFAULT_DAYS )
31+
32+ def say (self , msg ):
33+ if self .verbosity > 0 :
34+ sys .stdout .write (msg )
35+ sys .stdout .write ('\n ' )
36+
37+ def note (self , msg ):
38+ if self .verbosity > 1 :
39+ sys .stdout .write (msg )
40+ sys .stdout .write ('\n ' )
41+
42+ def mutter (self , msg ):
43+ if self .verbosity > 2 :
44+ sys .stdout .write (msg )
45+ sys .stdout .write ('\n ' )
46+
47+ def write (self , fn , new ):
48+ # normalize new
49+ new = re .sub (r'\r\n?' , r'\n' , new )
50+ try :
51+ with io .open (fn , encoding = 'utf-8' ) as f :
52+ old = f .read ()
53+ except IOError :
54+ old = ""
55+ if old .strip () != new .strip ():
56+ self .note ('Writing %s' % os .path .basename (fn ))
57+ with io .open (fn , "w" , encoding = 'utf-8' ) as f :
58+ f .write (new )
3259
3360 def handle (self , * args , ** options ):
34- documents = Document .objects .filter (type__slug = 'draft' )
61+ self .verbosity = options .get ("verbosity" , 1 )
62+ process_all = options .get ("all" )
63+ days = options .get ("days" )
64+ #
3565 bibxmldir = os .path .join (settings .BIBXML_BASE_PATH , 'bibxml3' )
3666 if not os .path .exists (bibxmldir ):
3767 os .makedirs (bibxmldir )
38- for doc in documents :
39- ref_text = render_to_string ('doc/bibxml.xml' , {'doc' : doc , 'doc_bibtype' :'I-D' })
40- ref_file_name = os .path .join (bibxmldir , 'reference.I-D.%s.xml' % (doc .name , ))
41- ref_rev_file_name = os .path .join (bibxmldir , 'reference.I-D.%s-%s.xml' % (doc .name , doc .rev ))
42- write (ref_file_name , ref_text )
43- write (ref_rev_file_name , ref_text )
44-
68+ #
69+ if process_all :
70+ doc_events = NewRevisionDocEvent .objects .filter (type = 'new_revision' , doc__type_id = 'draft' )
71+ else :
72+ start = datetime .datetime .now () - datetime .timedelta (days = days )
73+ doc_events = NewRevisionDocEvent .objects .filter (type = 'new_revision' , doc__type_id = 'draft' , time__gte = start )
74+ doc_events = doc_events .order_by ('time' )
75+
76+ for e in doc_events :
77+ self .mutter ('%s %s' % (e .time , e .doc .name ))
78+ try :
79+ e .doc .date = e .time .date ()
80+ doc = e .doc
81+ if e .rev != doc .rev :
82+ for h in doc .history_set .order_by ("-time" ):
83+ if e .rev == h .rev :
84+ doc = h
85+ break
86+ ref_text = '%s' % render_to_string ('doc/bibxml.xml' , {'doc' : doc , 'doc_bibtype' :'I-D' })
87+ if e .rev == e .doc .rev :
88+ ref_file_name = os .path .join (bibxmldir , 'reference.I-D.%s.xml' % (doc .name [6 :], ))
89+ self .write (ref_file_name , ref_text )
90+ else :
91+ self .note ("Skipping %s; outdated revision: %s" % (os .path .basename (ref_file_name ), e .rev ))
92+ ref_rev_file_name = os .path .join (bibxmldir , 'reference.I-D.%s-%s.xml' % (doc .name , doc .rev ))
93+ self .write (ref_rev_file_name , ref_text )
94+ except Exception as ee :
95+ sys .stderr .write ('\n %s-%s: %s\n ' % (doc .name , doc .rev , ee ))
0 commit comments