Merge lp:~dholbach/developer-ubuntu-com/fix-consistency-command into lp:developer-ubuntu-com

Proposed by Daniel Holbach
Status: Needs review
Proposed branch: lp:~dholbach/developer-ubuntu-com/fix-consistency-command
Merge into: lp:developer-ubuntu-com
Diff against target: 138 lines (+75/-27)
1 file modified
developer_portal/management/commands/check-consistency.py (+75/-27)
To merge this branch: bzr merge lp:~dholbach/developer-ubuntu-com/fix-consistency-command
Reviewer Review Type Date Requested Status
Ubuntu App Developer site developers Pending
Review via email: mp+295718@code.launchpad.net

Description of the change

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/srv/devportal-app-0/code/182/developer_portal/management/commands/check-consistency.py", line 52, in handle
    pages = find_duplicates_pages()
  File "/srv/devportal-app-0/code/182/developer_portal/management/commands/check-consistency.py", line 14, in find_duplicates_pages
    urls = [p.get_absolute_url() for p in Page.objects.all()]
  File "/usr/local/lib/python2.7/dist-packages/cms/models/pagemodel.py", line 160, in get_absolute_url
    return reverse('pages-details-by-slug', kwargs={"slug": path})
  File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 578, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 495, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns))
django.core.urlresolvers.NoReverseMatch: Reverse for 'pages-details-by-slug' with arguments '()' and keyword arguments '{'slug': ''}' not found. 1 pattern(s) tried: [u'None/(?P<slug>[0-9A-Za-z-_.//]+)/$']
Traceback (most recent call last):
  File "./run.py", line 30, in <module>
    subprocess.check_call(' '.join(sys.argv[1:]), env=env, shell=True)
  File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'python manage.py check-consistency' returned non-zero exit status 1

To post a comment you must log in.
226. By Daniel Holbach

fix order of delete/print to make sense

227. By Daniel Holbach

use new argparse-style api

228. By Daniel Holbach

only recommend --delete if actual broken pages were found

229. By Daniel Holbach

be more careful about finding URLs, make pep8 happy

230. By Daniel Holbach

re-use determined value for url

231. By Daniel Holbach

add divider lines, when looking for duplicate pages, separate drafts and public pages

232. By Daniel Holbach

fix delete_pages part

Unmerged revisions

232. By Daniel Holbach

fix delete_pages part

231. By Daniel Holbach

add divider lines, when looking for duplicate pages, separate drafts and public pages

230. By Daniel Holbach

re-use determined value for url

229. By Daniel Holbach

be more careful about finding URLs, make pep8 happy

228. By Daniel Holbach

only recommend --delete if actual broken pages were found

227. By Daniel Holbach

use new argparse-style api

226. By Daniel Holbach

fix order of delete/print to make sense

225. By Daniel Holbach

find pages with broken slugs, ie '', which let p.get_absolute_url() explode

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'developer_portal/management/commands/check-consistency.py'
2--- developer_portal/management/commands/check-consistency.py 2016-05-19 20:23:16 +0000
3+++ developer_portal/management/commands/check-consistency.py 2016-06-06 14:12:57 +0000
4@@ -1,6 +1,5 @@
5-from optparse import make_option
6-
7 from django.core.management.base import BaseCommand
8+from django.core.urlresolvers import NoReverseMatch
9
10 from cms.models import Page
11
12@@ -10,23 +9,47 @@
13 if not hasattr(p, 'publisher_draft')]
14
15
16-def find_duplicates_pages():
17- urls = [p.get_absolute_url() for p in Page.objects.all()]
18- return [p for p in Page.objects.all()
19- if urls.count(p.get_absolute_url()) == 2]
20+def find_pages_with_broken_slugs():
21+ page_ids = set()
22+ for p in Page.objects.all():
23+ try:
24+ url = p.get_absolute_url()
25+ except NoReverseMatch:
26+ page_ids.add(p.pk)
27+ return Page.objects.filter(pk__in=page_ids)
28+
29+
30+def find_duplicates_pages(draft=False):
31+ urls = []
32+ for p in Page.objects.filter(publisher_is_draft=draft):
33+ try:
34+ url = p.get_absolute_url()
35+ except NoReverseMatch:
36+ url = p.get_slug()
37+ urls += [url]
38+ return [p for p in Page.objects.filter(publisher_is_draft=draft)
39+ if urls.count(url) == 2]
40
41
42 def print_pages(pages):
43 for p in pages:
44- print('{} ({})'.format
45- (p.get_absolute_url(),
46+ try:
47+ url = p.get_absolute_url()
48+ except NoReverseMatch:
49+ url = p.get_slug()
50+ print('{}: {} ({})'.format
51+ (p.pk, url,
52 'Draft' if p.publisher_is_draft else 'Public'))
53
54
55 def delete_pages(pages):
56 for p in pages:
57+ try:
58+ url = p.get_absolute_url()
59+ except NoReverseMatch:
60+ url = p.get_slug()
61 print('Deleting page: {} ({})'.format
62- (p.get_absolute_url(),
63+ (url,
64 'Draft' if p.publisher_is_draft else 'Public'))
65 p.delete()
66
67@@ -34,28 +57,53 @@
68 class Command(BaseCommand):
69 help = "Make sure the CMS database is consistent."
70
71- option_list = BaseCommand.option_list + (
72- make_option(
73- '--delete', action='store_true', dest='delete',
74- default=True, help='Delete broken and inconsistent entries.'),
75- )
76+ def add_arguments(self, parser):
77+ parser.add_argument(
78+ '--delete',
79+ action='store_true',
80+ dest='delete',
81+ default=False,
82+ help='Delete broken and inconsistent entries.')
83
84 def handle(self, *args, **options):
85+ print('-----------------------------')
86+ found = False
87 pages = find_pages_without_publisher_draft()
88 print('Pages without .publisher_draft: {}'.format(len(pages)))
89 if pages:
90- if options['delete']:
91- print_pages(pages)
92- else:
93- delete_pages(pages)
94-
95- pages = find_duplicates_pages()
96- print('Duplicate pages: {}'.format(len(pages)))
97- if pages:
98- print_pages(pages)
99- if options['delete']:
100- print('Please remove them manually.')
101-
102- if not options['delete']:
103+ found = True
104+ if options['delete']:
105+ delete_pages(pages)
106+ else:
107+ print_pages(pages)
108+
109+ print('-----------------------------')
110+ pages = find_pages_with_broken_slugs()
111+ print('Pages with broken slugs: {}'.format(len(pages)))
112+ if pages:
113+ found = True
114+ if options['delete']:
115+ delete_pages(pages)
116+ else:
117+ print_pages(pages)
118+
119+ print('-----------------------------')
120+ pages = find_duplicates_pages(draft=False)
121+ print('Duplicate public pages: {}'.format(len(pages)))
122+ if pages:
123+ print_pages(pages)
124+ if options['delete']:
125+ print('Please remove them manually.')
126+
127+ print('-----------------------------')
128+ pages = find_duplicates_pages(draft=True)
129+ print('Duplicate draft pages: {}'.format(len(pages)))
130+ if pages:
131+ print_pages(pages)
132+ if options['delete']:
133+ print('Please remove them manually.')
134+
135+ if found and not options['delete']:
136+ print('-----------------------------')
137 print('If you want any inconsistencies fixed, please re-run this '
138 'command with the --delete option.')

Subscribers

People subscribed via source and target branches