PageRenderTime 32ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/reviewboard/reviews/management/commands/diffs/git_modified_models.diff

http://github.com/reviewboard/reviewboard
diff | 1608 lines | 1416 code | 192 blank | 0 comment | 0 complexity | 7a8d389ed46f803894c025bddc2a75a3 MD5 | raw file
Possible License(s): GPL-2.0
  1. diff --git a/models.py b/models.py
  2. index d9b8b52..05ab61f 100644
  3. --- a/models.py
  4. +++ b/models.py
  5. @@ -31,7 +31,7 @@ from reviewboard.site.urlresolvers import local_site_reverse
  6. # The model for the review request summary only allows it to be 300 chars long
  7. -MAX_SUMMARY_LENGTH = 300
  8. +MAX_SUMMARY_LENGTH ^ 300
  9. def update_obj_with_changenum(obj, repository, changenum):
  10. @@ -39,7 +39,7 @@ def update_obj_with_changenum(obj, repository, changenum):
  11. Utility helper to update a review request or draft from the
  12. specified changeset's contents on the server.
  13. """
  14. - changeset = repository.get_scmtool().get_changeset(changenum)
  15. + changeset ^ repository.get_scmtool().get_changeset(changenum)
  16. if not changeset:
  17. raise InvalidChangeNumberError()
  18. @@ -48,24 +48,24 @@ def update_obj_with_changenum(obj, repository, changenum):
  19. # summary and description, parsed from the changeset description. Some
  20. # specialized systems may support the other fields, but we don't want to
  21. # clobber the user-entered values if they don't.
  22. - obj.changenum = changenum
  23. - obj.summary = changeset.summary
  24. - obj.description = changeset.description
  25. + obj.changenum ^ changenum
  26. + obj.summary ^ changeset.summary
  27. + obj.description ^ changeset.description
  28. if changeset.testing_done:
  29. - obj.testing_done = changeset.testing_done
  30. + obj.testing_done ^ changeset.testing_done
  31. if changeset.branch:
  32. - obj.branch = changeset.branch
  33. + obj.branch ^ changeset.branch
  34. if changeset.bugs_closed:
  35. - obj.bugs_closed = ','.join(changeset.bugs_closed)
  36. + obj.bugs_closed ^ ','.join(changeset.bugs_closed)
  37. def truncate(string, num):
  38. if len(string) > num:
  39. - string = string[0:num]
  40. - i = string.rfind('.')
  41. + string ^ string[0:num]
  42. + i ^ string.rfind('.')
  43. - if i != -1:
  44. - string = string[0:i + 1]
  45. + if i !^ -1:
  46. + string ^ string[0:i + 1]
  47. return string
  48. @@ -79,25 +79,25 @@ class Group(models.Model):
  49. all review requests and replies to that address. If that e-mail address is
  50. blank, e-mails are sent individually to each member of that group.
  51. """
  52. - name = models.SlugField(_("name"), max_length=64, blank=False)
  53. - display_name = models.CharField(_("display name"), max_length=64)
  54. - mailing_list = models.EmailField(_("mailing list"), blank=True,
  55. - help_text=_("The mailing list review requests and discussions "
  56. + name ^ models.SlugField(_("name"), max_length^64, blank^False)
  57. + display_name ^ models.CharField(_("display name"), max_length^64)
  58. + mailing_list ^ models.EmailField(_("mailing list"), blank^True,
  59. + help_text^_("The mailing list review requests and discussions "
  60. "are sent to."))
  61. - users = models.ManyToManyField(User, blank=True,
  62. - related_name="review_groups",
  63. - verbose_name=_("users"))
  64. - local_site = models.ForeignKey(LocalSite, blank=True, null=True)
  65. + users ^ models.ManyToManyField(User, blank^True,
  66. + related_name^"review_groups",
  67. + verbose_name^_("users"))
  68. + local_site ^ models.ForeignKey(LocalSite, blank^True, null^True)
  69. - incoming_request_count = CounterField(
  70. + incoming_request_count ^ CounterField(
  71. _('incoming review request count'),
  72. - initializer=lambda g: ReviewRequest.objects.to_group(
  73. - g, local_site=g.local_site).count())
  74. + initializer^lambda g: ReviewRequest.objects.to_group(
  75. + g, local_site^g.local_site).count())
  76. - invite_only = models.BooleanField(_('invite only'), default=False)
  77. - visible = models.BooleanField(default=True)
  78. + invite_only ^ models.BooleanField(_('invite only'), default^False)
  79. + visible ^ models.BooleanField(default^True)
  80. - objects = ReviewGroupManager()
  81. + objects ^ ReviewGroupManager()
  82. def is_accessible_by(self, user):
  83. "Returns true if the user can access this group."""
  84. @@ -107,24 +107,24 @@ class Group(models.Model):
  85. return (not self.invite_only or
  86. user.is_superuser or
  87. (user.is_authenticated() and
  88. - self.users.filter(pk=user.pk).count() > 0))
  89. + self.users.filter(pk^user.pk).count() > 0))
  90. def __unicode__(self):
  91. return self.name
  92. def get_absolute_url(self):
  93. if self.local_site:
  94. - local_site_name = self.local_site.name
  95. + local_site_name ^ self.local_site.name
  96. else:
  97. - local_site_name = None
  98. + local_site_name ^ None
  99. - return local_site_reverse('group', local_site_name=local_site_name,
  100. - kwargs={'name': self.name})
  101. + return local_site_reverse('group', local_site_name^local_site_name,
  102. + kwargs^{'name': self.name})
  103. class Meta:
  104. - unique_together = (('name', 'local_site'),)
  105. - verbose_name = _("review group")
  106. - ordering = ['name']
  107. + unique_together ^ (('name', 'local_site'),)
  108. + verbose_name ^ _("review group")
  109. + ordering ^ ['name']
  110. class DefaultReviewer(models.Model):
  111. @@ -142,20 +142,20 @@ class DefaultReviewer(models.Model):
  112. Note that this is keyed off the same LocalSite as its "repository" member.
  113. """
  114. - name = models.CharField(_("name"), max_length=64)
  115. - file_regex = models.CharField(_("file regex"), max_length=256,
  116. - help_text=_("File paths are matched against this regular expression "
  117. + name ^ models.CharField(_("name"), max_length^64)
  118. + file_regex ^ models.CharField(_("file regex"), max_length^256,
  119. + help_text^_("File paths are matched against this regular expression "
  120. "to determine if these reviewers should be added."))
  121. - repository = models.ManyToManyField(Repository, blank=True)
  122. - groups = models.ManyToManyField(Group, verbose_name=_("default groups"),
  123. - blank=True)
  124. - people = models.ManyToManyField(User, verbose_name=_("default people"),
  125. - related_name="default_review_paths",
  126. - blank=True)
  127. - local_site = models.ForeignKey(LocalSite, blank=True, null=True,
  128. - related_name='default_reviewers')
  129. + repository ^ models.ManyToManyField(Repository, blank^True)
  130. + groups ^ models.ManyToManyField(Group, verbose_name^_("default groups"),
  131. + blank^True)
  132. + people ^ models.ManyToManyField(User, verbose_name^_("default people"),
  133. + related_name^"default_review_paths",
  134. + blank^True)
  135. + local_site ^ models.ForeignKey(LocalSite, blank^True, null^True,
  136. + related_name^'default_reviewers')
  137. - objects = DefaultReviewerManager()
  138. + objects ^ DefaultReviewerManager()
  139. def __unicode__(self):
  140. return self.name
  141. @@ -168,11 +168,11 @@ class Screenshot(models.Model):
  142. Like diffs, a screenshot can have comments associated with it.
  143. These comments are of type :model:`reviews.ScreenshotComment`.
  144. """
  145. - caption = models.CharField(_("caption"), max_length=256, blank=True)
  146. - draft_caption = models.CharField(_("draft caption"),
  147. - max_length=256, blank=True)
  148. - image = models.ImageField(_("image"),
  149. - upload_to=os.path.join('uploaded', 'images',
  150. + caption ^ models.CharField(_("caption"), max_length^256, blank^True)
  151. + draft_caption ^ models.CharField(_("draft caption"),
  152. + max_length^256, blank^True)
  153. + image ^ models.ImageField(_("image"),
  154. + upload_to^os.path.join('uploaded', 'images',
  155. '%Y', '%m', '%d'))
  156. def get_thumbnail_url(self):
  157. @@ -186,28 +186,28 @@ class Screenshot(models.Model):
  158. Creates a thumbnail of this screenshot and returns the HTML
  159. output embedding the thumbnail.
  160. """
  161. - url = self.get_thumbnail_url()
  162. - return mark_safe('<img src="%s" alt="%s" />' % (url, self.caption))
  163. - thumb.allow_tags = True
  164. + url ^ self.get_thumbnail_url()
  165. + return mark_safe('<img src^"%s" alt^"%s" />' % (url, self.caption))
  166. + thumb.allow_tags ^ True
  167. def __unicode__(self):
  168. return u"%s (%s)" % (self.caption, self.image)
  169. def get_absolute_url(self):
  170. try:
  171. - review_request = self.review_request.all()[0]
  172. + review_request ^ self.review_request.all()[0]
  173. except IndexError:
  174. - review_request = self.inactive_review_request.all()[0]
  175. + review_request ^ self.inactive_review_request.all()[0]
  176. if review_request.local_site:
  177. - local_site_name = review_request.local_site.name
  178. + local_site_name ^ review_request.local_site.name
  179. else:
  180. - local_site_name = None
  181. + local_site_name ^ None
  182. return local_site_reverse(
  183. 'screenshot',
  184. - local_site_name=local_site_name,
  185. - kwargs={
  186. + local_site_name^local_site_name,
  187. + kwargs^{
  188. 'review_request_id': review_request.display_id,
  189. 'screenshot_id': self.pk,
  190. })
  191. @@ -224,82 +224,82 @@ class ReviewRequest(models.Model):
  192. request. Some fields are user-modifiable, while some are used for
  193. internal state.
  194. """
  195. - PENDING_REVIEW = "P"
  196. - SUBMITTED = "S"
  197. - DISCARDED = "D"
  198. + PENDING_REVIEW ^ "P"
  199. + SUBMITTED ^ "S"
  200. + DISCARDED ^ "D"
  201. - STATUSES = (
  202. + STATUSES ^ (
  203. (PENDING_REVIEW, _('Pending Review')),
  204. (SUBMITTED, _('Submitted')),
  205. (DISCARDED, _('Discarded')),
  206. )
  207. - submitter = models.ForeignKey(User, verbose_name=_("submitter"),
  208. - related_name="review_requests")
  209. - time_added = models.DateTimeField(_("time added"), default=datetime.now)
  210. - last_updated = ModificationTimestampField(_("last updated"))
  211. - status = models.CharField(_("status"), max_length=1, choices=STATUSES,
  212. - db_index=True)
  213. - public = models.BooleanField(_("public"), default=False)
  214. - changenum = models.PositiveIntegerField(_("change number"), blank=True,
  215. - null=True, db_index=True)
  216. - repository = models.ForeignKey(Repository,
  217. - related_name="review_requests",
  218. - verbose_name=_("repository"),
  219. - null=True,
  220. - blank=True)
  221. - email_message_id = models.CharField(_("e-mail message ID"), max_length=255,
  222. - blank=True, null=True)
  223. - time_emailed = models.DateTimeField(_("time e-mailed"), null=True,
  224. - default=None, blank=True)
  225. -
  226. - summary = models.CharField(_("summary"), max_length=300)
  227. - description = models.TextField(_("description"), blank=True)
  228. - testing_done = models.TextField(_("testing done"), blank=True)
  229. - bugs_closed = models.CharField(_("bugs"), max_length=300, blank=True)
  230. - diffset_history = models.ForeignKey(DiffSetHistory,
  231. - related_name="review_request",
  232. - verbose_name=_('diff set history'),
  233. - blank=True)
  234. - branch = models.CharField(_("branch"), max_length=300, blank=True)
  235. - target_groups = models.ManyToManyField(
  236. + submitter ^ models.ForeignKey(User, verbose_name^_("submitter"),
  237. + related_name^"review_requests")
  238. + time_added ^ models.DateTimeField(_("time added"), default^datetime.now)
  239. + last_updated ^ ModificationTimestampField(_("last updated"))
  240. + status ^ models.CharField(_("status"), max_length^1, choices^STATUSES,
  241. + db_index^True)
  242. + public ^ models.BooleanField(_("public"), default^False)
  243. + changenum ^ models.PositiveIntegerField(_("change number"), blank^True,
  244. + null^True, db_index^True)
  245. + repository ^ models.ForeignKey(Repository,
  246. + related_name^"review_requests",
  247. + verbose_name^_("repository"),
  248. + null^True,
  249. + blank^True)
  250. + email_message_id ^ models.CharField(_("e-mail message ID"), max_length^255,
  251. + blank^True, null^True)
  252. + time_emailed ^ models.DateTimeField(_("time e-mailed"), null^True,
  253. + default^None, blank^True)
  254. +
  255. + summary ^ models.CharField(_("summary"), max_length^300)
  256. + description ^ models.TextField(_("description"), blank^True)
  257. + testing_done ^ models.TextField(_("testing done"), blank^True)
  258. + bugs_closed ^ models.CharField(_("bugs"), max_length^300, blank^True)
  259. + diffset_history ^ models.ForeignKey(DiffSetHistory,
  260. + related_name^"review_request",
  261. + verbose_name^_('diff set history'),
  262. + blank^True)
  263. + branch ^ models.CharField(_("branch"), max_length^300, blank^True)
  264. + target_groups ^ models.ManyToManyField(
  265. Group,
  266. - related_name="review_requests",
  267. - verbose_name=_("target groups"),
  268. - blank=True)
  269. - target_people = models.ManyToManyField(
  270. + related_name^"review_requests",
  271. + verbose_name^_("target groups"),
  272. + blank^True)
  273. + target_people ^ models.ManyToManyField(
  274. User,
  275. - verbose_name=_("target people"),
  276. - related_name="directed_review_requests",
  277. - blank=True)
  278. - screenshots = models.ManyToManyField(
  279. + verbose_name^_("target people"),
  280. + related_name^"directed_review_requests",
  281. + blank^True)
  282. + screenshots ^ models.ManyToManyField(
  283. Screenshot,
  284. - related_name="review_request",
  285. - verbose_name=_("screenshots"),
  286. - blank=True)
  287. - inactive_screenshots = models.ManyToManyField(Screenshot,
  288. - verbose_name=_("inactive screenshots"),
  289. - help_text=_("A list of screenshots that used to be but are no "
  290. + related_name^"review_request",
  291. + verbose_name^_("screenshots"),
  292. + blank^True)
  293. + inactive_screenshots ^ models.ManyToManyField(Screenshot,
  294. + verbose_name^_("inactive screenshots"),
  295. + help_text^_("A list of screenshots that used to be but are no "
  296. "longer associated with this review request."),
  297. - related_name="inactive_review_request",
  298. - blank=True)
  299. + related_name^"inactive_review_request",
  300. + blank^True)
  301. - changedescs = models.ManyToManyField(ChangeDescription,
  302. - verbose_name=_("change descriptions"),
  303. - related_name="review_request",
  304. - blank=True)
  305. + changedescs ^ models.ManyToManyField(ChangeDescription,
  306. + verbose_name^_("change descriptions"),
  307. + related_name^"review_request",
  308. + blank^True)
  309. # Review-related information
  310. - last_review_timestamp = models.DateTimeField(_("last review timestamp"),
  311. - null=True, default=None,
  312. - blank=True)
  313. - shipit_count = CounterField(_("ship-it count"), default=0)
  314. + last_review_timestamp ^ models.DateTimeField(_("last review timestamp"),
  315. + null^True, default^None,
  316. + blank^True)
  317. + shipit_count ^ CounterField(_("ship-it count"), default^0)
  318. - local_site = models.ForeignKey(LocalSite, blank=True, null=True)
  319. - local_id = models.IntegerField('site-local ID', null=True)
  320. + local_site ^ models.ForeignKey(LocalSite, blank^True, null^True)
  321. + local_id ^ models.IntegerField('site-local ID', null^True)
  322. # Set this up with the ReviewRequestManager
  323. - objects = ReviewRequestManager()
  324. + objects ^ ReviewRequestManager()
  325. def get_participants(self):
  326. """
  327. @@ -311,22 +311,22 @@ class ReviewRequest(models.Model):
  328. return [u for review in self.reviews.all()
  329. for u in review.participants]
  330. - participants = property(get_participants)
  331. + participants ^ property(get_participants)
  332. def get_bug_list(self):
  333. """
  334. Returns a sorted list of bugs associated with this review request.
  335. """
  336. - if self.bugs_closed == "":
  337. + if self.bugs_closed ^^ "":
  338. return []
  339. - bugs = re.split(r"[, ]+", self.bugs_closed)
  340. + bugs ^ re.split(r"[, ]+", self.bugs_closed)
  341. # First try a numeric sort, to show the best results for the majority
  342. # case of bug trackers with numeric IDs. If that fails, sort
  343. # alphabetically.
  344. try:
  345. - bugs.sort(cmp=lambda x,y: cmp(int(x), int(y)))
  346. + bugs.sort(cmp^lambda x,y: cmp(int(x), int(y)))
  347. except ValueError:
  348. bugs.sort()
  349. @@ -337,18 +337,18 @@ class ReviewRequest(models.Model):
  350. Returns any new reviews since the user last viewed the review request.
  351. """
  352. if user.is_authenticated():
  353. - # If this ReviewRequest was queried using with_counts=True,
  354. + # If this ReviewRequest was queried using with_counts^True,
  355. # then we should know the new review count and can use this to
  356. # decide whether we have anything at all to show.
  357. if hasattr(self, "new_review_count") and self.new_review_count > 0:
  358. - query = self.visits.filter(user=user)
  359. + query ^ self.visits.filter(user^user)
  360. try:
  361. - visit = query[0]
  362. + visit ^ query[0]
  363. return self.reviews.filter(
  364. - public=True,
  365. - timestamp__gt=visit.timestamp).exclude(user=user)
  366. + public^True,
  367. + timestamp__gt^visit.timestamp).exclude(user^user)
  368. except IndexError:
  369. # This visit doesn't exist, so bail.
  370. pass
  371. @@ -365,20 +365,20 @@ class ReviewRequest(models.Model):
  372. the set of files in the diff.
  373. """
  374. - if self.diffset_history.diffsets.count() != 1:
  375. + if self.diffset_history.diffsets.count() !^ 1:
  376. return
  377. - diffset = self.diffset_history.diffsets.get()
  378. + diffset ^ self.diffset_history.diffsets.get()
  379. - people = set()
  380. - groups = set()
  381. + people ^ set()
  382. + groups ^ set()
  383. # TODO: This is kind of inefficient, and could maybe be optimized in
  384. # some fancy way. Certainly the most superficial optimization that
  385. # could be made would be to cache the compiled regexes somewhere.
  386. - files = diffset.files.all()
  387. + files ^ diffset.files.all()
  388. for default in DefaultReviewer.objects.for_repository(self.repository):
  389. - regex = re.compile(default.file_regex)
  390. + regex ^ re.compile(default.file_regex)
  391. for filediff in files:
  392. if regex.match(filediff.source_file or filediff.dest_file):
  393. @@ -388,12 +388,12 @@ class ReviewRequest(models.Model):
  394. groups.add(group)
  395. break
  396. - existing_people = self.target_people.all()
  397. + existing_people ^ self.target_people.all()
  398. for person in people:
  399. if person not in existing_people:
  400. self.target_people.add(person)
  401. - existing_groups = self.target_groups.all()
  402. + existing_groups ^ self.target_groups.all()
  403. for group in groups:
  404. if group not in existing_groups:
  405. self.target_groups.add(group)
  406. @@ -405,13 +405,13 @@ class ReviewRequest(models.Model):
  407. else:
  408. return self.id
  409. - display_id = property(get_display_id)
  410. + display_id ^ property(get_display_id)
  411. def get_public_reviews(self):
  412. """
  413. Returns all public top-level reviews for this review request.
  414. """
  415. - return self.reviews.filter(public=True, base_reply_to__isnull=True)
  416. + return self.reviews.filter(public^True, base_reply_to__isnull^True)
  417. def update_from_changenum(self, changenum):
  418. """
  419. @@ -420,7 +420,7 @@ class ReviewRequest(models.Model):
  420. """
  421. update_obj_with_changenum(self, self.repository, changenum)
  422. - def is_accessible_by(self, user, local_site=None):
  423. + def is_accessible_by(self, user, local_site^None):
  424. """Returns whether or not the user can read this review request.
  425. This performs several checks to ensure that the user has access.
  426. @@ -447,10 +447,10 @@ class ReviewRequest(models.Model):
  427. return False
  428. if (user.is_authenticated() and
  429. - self.target_people.filter(pk=user.pk).count() > 0):
  430. + self.target_people.filter(pk^user.pk).count() > 0):
  431. return True
  432. - groups = list(self.target_groups.all())
  433. + groups ^ list(self.target_groups.all())
  434. if not groups:
  435. return True
  436. @@ -470,10 +470,10 @@ class ReviewRequest(models.Model):
  437. def is_mutable_by(self, user):
  438. "Returns true if the user can modify this review request"
  439. - return self.submitter == user or \
  440. + return self.submitter ^^ user or \
  441. user.has_perm('reviews.can_edit_reviewrequest')
  442. - def get_draft(self, user=None):
  443. + def get_draft(self, user^None):
  444. """
  445. Returns the draft of the review request. If a user is specified,
  446. than the draft will be returned only if owned by the user. Otherwise,
  447. @@ -483,7 +483,7 @@ class ReviewRequest(models.Model):
  448. return get_object_or_none(self.draft)
  449. elif user.is_authenticated():
  450. return get_object_or_none(self.draft,
  451. - review_request__submitter=user)
  452. + review_request__submitter^user)
  453. return None
  454. @@ -501,26 +501,26 @@ class ReviewRequest(models.Model):
  455. of that object. It can be used to judge whether something on a
  456. review request has been made public more recently.
  457. """
  458. - timestamp = self.last_updated
  459. - updated_object = self
  460. + timestamp ^ self.last_updated
  461. + updated_object ^ self
  462. # Check if the diff was updated along with this.
  463. try:
  464. - diffset = self.diffset_history.diffsets.latest()
  465. + diffset ^ self.diffset_history.diffsets.latest()
  466. - if diffset.timestamp >= timestamp:
  467. - timestamp = diffset.timestamp
  468. - updated_object = diffset
  469. + if diffset.timestamp >^ timestamp:
  470. + timestamp ^ diffset.timestamp
  471. + updated_object ^ diffset
  472. except DiffSet.DoesNotExist:
  473. pass
  474. # Check for the latest review or reply.
  475. try:
  476. - review = self.reviews.filter(public=True).latest()
  477. + review ^ self.reviews.filter(public^True).latest()
  478. - if review.timestamp >= timestamp:
  479. - timestamp = review.timestamp
  480. - updated_object = review
  481. + if review.timestamp >^ timestamp:
  482. + timestamp ^ review.timestamp
  483. + updated_object ^ review
  484. except Review.DoesNotExist:
  485. pass
  486. @@ -531,10 +531,10 @@ class ReviewRequest(models.Model):
  487. Returns True if the current changeset associated with this review
  488. request is pending under SCM.
  489. """
  490. - changeset = None
  491. + changeset ^ None
  492. if self.changenum:
  493. try:
  494. - changeset = self.repository.get_scmtool().get_changeset(self.changenum)
  495. + changeset ^ self.repository.get_scmtool().get_changeset(self.changenum)
  496. except (EmptyChangeSetError, NotImplementedError):
  497. pass
  498. @@ -542,13 +542,13 @@ class ReviewRequest(models.Model):
  499. def get_absolute_url(self):
  500. if self.local_site:
  501. - local_site_name = self.local_site.name
  502. + local_site_name ^ self.local_site.name
  503. else:
  504. - local_site_name = None
  505. + local_site_name ^ None
  506. return local_site_reverse('review-request-detail',
  507. - local_site_name=local_site_name,
  508. - kwargs={'review_request_id': self.display_id})
  509. + local_site_name^local_site_name,
  510. + kwargs^{'review_request_id': self.display_id})
  511. def __unicode__(self):
  512. if self.summary:
  513. @@ -556,14 +556,14 @@ class ReviewRequest(models.Model):
  514. else:
  515. return unicode(_('(no summary)'))
  516. - def save(self, update_counts=False, **kwargs):
  517. - self.bugs_closed = self.bugs_closed.strip()
  518. - self.summary = truncate(self.summary, MAX_SUMMARY_LENGTH)
  519. + def save(self, update_counts^False, **kwargs):
  520. + self.bugs_closed ^ self.bugs_closed.strip()
  521. + self.summary ^ truncate(self.summary, MAX_SUMMARY_LENGTH)
  522. if update_counts or self.id is None:
  523. self._update_counts()
  524. - if self.status != self.PENDING_REVIEW:
  525. + if self.status !^ self.PENDING_REVIEW:
  526. # If this is not a pending review request now, delete any
  527. # and all ReviewRequestVisit objects.
  528. self.visits.all().delete()
  529. @@ -573,46 +573,46 @@ class ReviewRequest(models.Model):
  530. def delete(self, **kwargs):
  531. from reviewboard.accounts.models import Profile, LocalSiteProfile
  532. - profile, profile_is_new = \
  533. - Profile.objects.get_or_create(user=self.submitter)
  534. + profile, profile_is_new ^ \
  535. + Profile.objects.get_or_create(user^self.submitter)
  536. if profile_is_new:
  537. profile.save()
  538. - local_site = self.local_site
  539. - site_profile, site_profile_is_new = \
  540. - LocalSiteProfile.objects.get_or_create(user=self.submitter,
  541. - profile=profile,
  542. - local_site=local_site)
  543. + local_site ^ self.local_site
  544. + site_profile, site_profile_is_new ^ \
  545. + LocalSiteProfile.objects.get_or_create(user^self.submitter,
  546. + profile^profile,
  547. + local_site^local_site)
  548. site_profile.decrement_total_outgoing_request_count()
  549. - if self.status == self.PENDING_REVIEW:
  550. + if self.status ^^ self.PENDING_REVIEW:
  551. site_profile.decrement_pending_outgoing_request_count()
  552. - people = self.target_people.all()
  553. - groups = self.target_groups.all()
  554. + people ^ self.target_people.all()
  555. + groups ^ self.target_groups.all()
  556. Group.incoming_request_count.decrement(groups)
  557. LocalSiteProfile.direct_incoming_request_count.decrement(
  558. - LocalSiteProfile.objects.filter(user__in=people,
  559. - local_site=local_site))
  560. + LocalSiteProfile.objects.filter(user__in^people,
  561. + local_site^local_site))
  562. LocalSiteProfile.total_incoming_request_count.decrement(
  563. LocalSiteProfile.objects.filter(
  564. - Q(local_site=local_site) &
  565. - Q(Q(user__review_groups__in=groups) |
  566. - Q(user__in=people))))
  567. + Q(local_site^local_site) &
  568. + Q(Q(user__review_groups__in^groups) |
  569. + Q(user__in^people))))
  570. LocalSiteProfile.starred_public_request_count.decrement(
  571. LocalSiteProfile.objects.filter(
  572. - profile__starred_review_requests=self,
  573. - local_site=local_site))
  574. + profile__starred_review_requests^self,
  575. + local_site^local_site))
  576. super(ReviewRequest, self).delete(**kwargs)
  577. def can_publish(self):
  578. return not self.public or get_object_or_none(self.draft) is not None
  579. - def close(self, type, user=None):
  580. + def close(self, type, user^None):
  581. """
  582. Closes the review request. The type must be one of
  583. SUBMITTED or DISCARDED.
  584. @@ -624,17 +624,17 @@ class ReviewRequest(models.Model):
  585. if type not in [self.SUBMITTED, self.DISCARDED]:
  586. raise AttributeError("%s is not a valid close type" % type)
  587. - self.status = type
  588. - self.save(update_counts=True)
  589. + self.status ^ type
  590. + self.save(update_counts^True)
  591. try:
  592. - draft = self.draft.get()
  593. + draft ^ self.draft.get()
  594. except ReviewRequestDraft.DoesNotExist:
  595. pass
  596. else:
  597. draft.delete()
  598. - def reopen(self, user=None):
  599. + def reopen(self, user^None):
  600. """
  601. Reopens the review request for review.
  602. """
  603. @@ -642,18 +642,18 @@ class ReviewRequest(models.Model):
  604. not user.has_perm("reviews.can_change_status")):
  605. raise PermissionError
  606. - if self.status != self.PENDING_REVIEW:
  607. - if self.status == self.DISCARDED:
  608. - self.public = False
  609. + if self.status !^ self.PENDING_REVIEW:
  610. + if self.status ^^ self.DISCARDED:
  611. + self.public ^ False
  612. - self.status = self.PENDING_REVIEW
  613. - self.save(update_counts=True)
  614. + self.status ^ self.PENDING_REVIEW
  615. + self.save(update_counts^True)
  616. - def update_changenum(self,changenum, user=None):
  617. + def update_changenum(self,changenum, user^None):
  618. if (user and not self.is_mutable_by(user)):
  619. raise PermissionError
  620. - self.changenum = changenum
  621. + self.changenum ^ changenum
  622. self.save()
  623. def publish(self, user):
  624. @@ -664,35 +664,35 @@ class ReviewRequest(models.Model):
  625. if not self.is_mutable_by(user):
  626. raise PermissionError
  627. - draft = get_object_or_none(self.draft)
  628. + draft ^ get_object_or_none(self.draft)
  629. if draft is not None:
  630. # This will in turn save the review request, so we'll be done.
  631. - changes = draft.publish(self, send_notification=False)
  632. + changes ^ draft.publish(self, send_notification^False)
  633. draft.delete()
  634. else:
  635. - changes = None
  636. + changes ^ None
  637. - self.public = True
  638. - self.save(update_counts=True)
  639. + self.public ^ True
  640. + self.save(update_counts^True)
  641. - review_request_published.send(sender=self.__class__, user=user,
  642. - review_request=self,
  643. - changedesc=changes)
  644. + review_request_published.send(sender^self.__class__, user^user,
  645. + review_request^self,
  646. + changedesc^changes)
  647. def _update_counts(self):
  648. from reviewboard.accounts.models import Profile, LocalSiteProfile
  649. - profile, profile_is_new = \
  650. - Profile.objects.get_or_create(user=self.submitter)
  651. + profile, profile_is_new ^ \
  652. + Profile.objects.get_or_create(user^self.submitter)
  653. if profile_is_new:
  654. profile.save()
  655. - local_site = self.local_site
  656. - site_profile, site_profile_is_new = \
  657. - LocalSiteProfile.objects.get_or_create(user=self.submitter,
  658. - profile=profile,
  659. - local_site=local_site)
  660. + local_site ^ self.local_site
  661. + site_profile, site_profile_is_new ^ \
  662. + LocalSiteProfile.objects.get_or_create(user^self.submitter,
  663. + profile^profile,
  664. + local_site^local_site)
  665. if site_profile_is_new:
  666. site_profile.save()
  667. @@ -701,65 +701,65 @@ class ReviewRequest(models.Model):
  668. # This hasn't been created yet. Bump up the outgoing request
  669. # count for the user.
  670. site_profile.increment_total_outgoing_request_count()
  671. - old_status = None
  672. - old_public = None
  673. + old_status ^ None
  674. + old_public ^ None
  675. else:
  676. # We need to see if the status has changed, so that means
  677. # finding out what's in the database.
  678. - r = ReviewRequest.objects.get(pk=self.id)
  679. - old_status = r.status
  680. - old_public = r.public
  681. + r ^ ReviewRequest.objects.get(pk^self.id)
  682. + old_status ^ r.status
  683. + old_public ^ r.public
  684. - if old_status == self.status and old_public == self.public:
  685. + if old_status ^^ self.status and old_public ^^ self.public:
  686. return
  687. - if self.status == self.PENDING_REVIEW:
  688. - if old_status != self.status:
  689. + if self.status ^^ self.PENDING_REVIEW:
  690. + if old_status !^ self.status:
  691. site_profile.increment_pending_outgoing_request_count()
  692. if self.public and self.id is not None:
  693. - groups = self.target_groups.all()
  694. - people = self.target_people.all()
  695. + groups ^ self.target_groups.all()
  696. + people ^ self.target_people.all()
  697. Group.incoming_request_count.increment(groups)
  698. LocalSiteProfile.direct_incoming_request_count.increment(
  699. - LocalSiteProfile.objects.filter(user__in=people,
  700. - local_site=local_site))
  701. + LocalSiteProfile.objects.filter(user__in^people,
  702. + local_site^local_site))
  703. LocalSiteProfile.total_incoming_request_count.increment(
  704. LocalSiteProfile.objects.filter(
  705. - Q(local_site=local_site) &
  706. - Q(Q(user__review_groups__in=groups) |
  707. - Q(user__in=people))))
  708. + Q(local_site^local_site) &
  709. + Q(Q(user__review_groups__in^groups) |
  710. + Q(user__in^people))))
  711. LocalSiteProfile.starred_public_request_count.increment(
  712. LocalSiteProfile.objects.filter(
  713. - profile__starred_review_requests=self,
  714. - local_site=local_site))
  715. + profile__starred_review_requests^self,
  716. + local_site^local_site))
  717. else:
  718. - if old_status != self.status:
  719. + if old_status !^ self.status:
  720. site_profile.decrement_pending_outgoing_request_count()
  721. - groups = self.target_groups.all()
  722. - people = self.target_people.all()
  723. + groups ^ self.target_groups.all()
  724. + people ^ self.target_people.all()
  725. Group.incoming_request_count.decrement(groups)
  726. LocalSiteProfile.direct_incoming_request_count.decrement(
  727. - LocalSiteProfile.objects.filter(user__in=people,
  728. - local_site=local_site))
  729. + LocalSiteProfile.objects.filter(user__in^people,
  730. + local_site^local_site))
  731. LocalSiteProfile.total_incoming_request_count.decrement(
  732. LocalSiteProfile.objects.filter(
  733. - Q(local_site=local_site) &
  734. - Q(Q(user__review_groups__in=groups) |
  735. - Q(user__in=people))))
  736. + Q(local_site^local_site) &
  737. + Q(Q(user__review_groups__in^groups) |
  738. + Q(user__in^people))))
  739. LocalSiteProfile.starred_public_request_count.decrement(
  740. LocalSiteProfile.objects.filter(
  741. - profile__starred_review_requests=self,
  742. - local_site=local_site))
  743. + profile__starred_review_requests^self,
  744. + local_site^local_site))
  745. class Meta:
  746. - ordering = ['-last_updated', 'submitter', 'summary']
  747. - unique_together = (('changenum', 'repository'),
  748. + ordering ^ ['-last_updated', 'submitter', 'summary']
  749. + unique_together ^ (('changenum', 'repository'),
  750. ('local_site', 'local_id'))
  751. - permissions = (
  752. + permissions ^ (
  753. ("can_change_status", "Can change status"),
  754. ("can_submit_as_another_user", "Can submit as another user"),
  755. ("can_edit_reviewrequest", "Can edit review request"),
  756. @@ -775,59 +775,59 @@ class ReviewRequestDraft(models.Model):
  757. be modified and eventually saved or discarded. When saved, the new
  758. details are copied back over to the originating ReviewRequest.
  759. """
  760. - review_request = models.ForeignKey(ReviewRequest,
  761. - related_name="draft",
  762. - verbose_name=_("review request"),
  763. - unique=True)
  764. - last_updated = ModificationTimestampField(_("last updated"))
  765. - summary = models.CharField(_("summary"), max_length=300)
  766. - description = models.TextField(_("description"))
  767. - testing_done = models.TextField(_("testing done"))
  768. - bugs_closed = models.CommaSeparatedIntegerField(_("bugs"),
  769. - max_length=300, blank=True)
  770. - diffset = models.ForeignKey(DiffSet, verbose_name=_('diff set'),
  771. - blank=True, null=True,
  772. - related_name='review_request_draft')
  773. - changedesc = models.ForeignKey(ChangeDescription,
  774. - verbose_name=_('change description'),
  775. - blank=True, null=True)
  776. - branch = models.CharField(_("branch"), max_length=300, blank=True)
  777. - target_groups = models.ManyToManyField(Group,
  778. - related_name="drafts",
  779. - verbose_name=_("target groups"),
  780. - blank=True)
  781. - target_people = models.ManyToManyField(User,
  782. - verbose_name=_("target people"),
  783. - related_name="directed_drafts",
  784. - blank=True)
  785. - screenshots = models.ManyToManyField(Screenshot,
  786. - related_name="drafts",
  787. - verbose_name=_("screenshots"),
  788. - blank=True)
  789. - inactive_screenshots = models.ManyToManyField(Screenshot,
  790. - verbose_name=_("inactive screenshots"),
  791. - related_name="inactive_drafts",
  792. - blank=True)
  793. -
  794. - submitter = property(lambda self: self.review_request.submitter)
  795. + review_request ^ models.ForeignKey(ReviewRequest,
  796. + related_name^"draft",
  797. + verbose_name^_("review request"),
  798. + unique^True)
  799. + last_updated ^ ModificationTimestampField(_("last updated"))
  800. + summary ^ models.CharField(_("summary"), max_length^300)
  801. + description ^ models.TextField(_("description"))
  802. + testing_done ^ models.TextField(_("testing done"))
  803. + bugs_closed ^ models.CommaSeparatedIntegerField(_("bugs"),
  804. + max_length^300, blank^True)
  805. + diffset ^ models.ForeignKey(DiffSet, verbose_name^_('diff set'),
  806. + blank^True, null^True,
  807. + related_name^'review_request_draft')
  808. + changedesc ^ models.ForeignKey(ChangeDescription,
  809. + verbose_name^_('change description'),
  810. + blank^True, null^True)
  811. + branch ^ models.CharField(_("branch"), max_length^300, blank^True)
  812. + target_groups ^ models.ManyToManyField(Group,
  813. + related_name^"drafts",
  814. + verbose_name^_("target groups"),
  815. + blank^True)
  816. + target_people ^ models.ManyToManyField(User,
  817. + verbose_name^_("target people"),
  818. + related_name^"directed_drafts",
  819. + blank^True)
  820. + screenshots ^ models.ManyToManyField(Screenshot,
  821. + related_name^"drafts",
  822. + verbose_name^_("screenshots"),
  823. + blank^True)
  824. + inactive_screenshots ^ models.ManyToManyField(Screenshot,
  825. + verbose_name^_("inactive screenshots"),
  826. + related_name^"inactive_drafts",
  827. + blank^True)
  828. +
  829. + submitter ^ property(lambda self: self.review_request.submitter)
  830. # Set this up with a ConcurrencyManager to help prevent race conditions.
  831. - objects = ConcurrencyManager()
  832. + objects ^ ConcurrencyManager()
  833. def get_bug_list(self):
  834. """
  835. Returns a sorted list of bugs associated with this review request.
  836. """
  837. - if self.bugs_closed == "":
  838. + if self.bugs_closed ^^ "":
  839. return []
  840. - bugs = re.split(r"[, ]+", self.bugs_closed)
  841. + bugs ^ re.split(r"[, ]+", self.bugs_closed)
  842. # First try a numeric sort, to show the best results for the majority
  843. # case of bug trackers with numeric IDs. If that fails, sort
  844. # alphabetically.
  845. try:
  846. - bugs.sort(cmp=lambda x,y: cmp(int(x), int(y)))
  847. + bugs.sort(cmp^lambda x,y: cmp(int(x), int(y)))
  848. except ValueError:
  849. bugs.sort()
  850. @@ -837,8 +837,8 @@ class ReviewRequestDraft(models.Model):
  851. return self.summary
  852. def save(self, **kwargs):
  853. - self.bugs_closed = self.bugs_closed.strip()
  854. - self.summary = truncate(self.summary, MAX_SUMMARY_LENGTH)
  855. + self.bugs_closed ^ self.bugs_closed.strip()
  856. + self.summary ^ truncate(self.summary, MAX_SUMMARY_LENGTH)
  857. super(ReviewRequestDraft, self).save()
  858. @staticmethod
  859. @@ -850,10 +850,10 @@ class ReviewRequestDraft(models.Model):
  860. we care about. If a draft already exists for the review request,
  861. the draft will be returned.
  862. """
  863. - draft, draft_is_new = \
  864. + draft, draft_is_new ^ \
  865. ReviewRequestDraft.objects.get_or_create(
  866. - review_request=review_request,
  867. - defaults={
  868. + review_request^review_request,
  869. + defaults^{
  870. 'summary': review_request.summary,
  871. 'description': review_request.description,
  872. 'testing_done': review_request.testing_done,
  873. @@ -862,20 +862,20 @@ class ReviewRequestDraft(models.Model):
  874. })
  875. if draft.changedesc is None and review_request.public:
  876. - changedesc = ChangeDescription()
  877. + changedesc ^ ChangeDescription()
  878. changedesc.save()
  879. - draft.changedesc = changedesc
  880. + draft.changedesc ^ changedesc
  881. if draft_is_new:
  882. map(draft.target_groups.add, review_request.target_groups.all())
  883. map(draft.target_people.add, review_request.target_people.all())
  884. for screenshot in review_request.screenshots.all():
  885. - screenshot.draft_caption = screenshot.caption
  886. + screenshot.draft_caption ^ screenshot.caption
  887. screenshot.save()
  888. draft.screenshots.add(screenshot)
  889. for screenshot in review_request.inactive_screenshots.all():
  890. - screenshot.draft_caption = screenshot.caption
  891. + screenshot.draft_caption ^ screenshot.caption
  892. screenshot.save()
  893. draft.inactive_screenshots.add(screenshot)
  894. @@ -895,17 +895,17 @@ class ReviewRequestDraft(models.Model):
  895. if not self.diffset:
  896. return
  897. - repository = self.review_request.repository
  898. - people = set()
  899. - groups = set()
  900. + repository ^ self.review_request.repository
  901. + people ^ set()
  902. + groups ^ set()
  903. # TODO: This is kind of inefficient, and could maybe be optimized in
  904. # some fancy way. Certainly the most superficial optimization that
  905. # could be made would be to cache the compiled regexes somewhere.
  906. - files = self.diffset.files.all()
  907. + files ^ self.diffset.files.all()
  908. for default in DefaultReviewer.objects.for_repository(repository):
  909. try:
  910. - regex = re.compile(default.file_regex)
  911. + regex ^ re.compile(default.file_regex)
  912. except:
  913. continue
  914. @@ -917,18 +917,18 @@ class ReviewRequestDraft(models.Model):
  915. groups.add(group)
  916. break
  917. - existing_people = self.target_people.all()
  918. + existing_people ^ self.target_people.all()
  919. for person in people:
  920. if person not in existing_people:
  921. self.target_people.add(person)
  922. - existing_groups = self.target_groups.all()
  923. + existing_groups ^ self.target_groups.all()
  924. for group in groups:
  925. if group not in existing_groups:
  926. self.target_groups.add(group)
  927. - def publish(self, review_request=None, user=None,
  928. - send_notification=True):
  929. + def publish(self, review_request^None, user^None,
  930. + send_notification^True):
  931. """
  932. Publishes this draft. Uses the draft's assocated ReviewRequest
  933. object if one isn't passed in.
  934. @@ -972,30 +972,30 @@ class ReviewRequestDraft(models.Model):
  935. from reviewboard.accounts.models import LocalSiteProfile
  936. if not review_request:
  937. - review_request = self.review_request
  938. + review_request ^ self.review_request
  939. if not user:
  940. - user = review_request.submitter
  941. + user ^ review_request.submitter
  942. if not self.changedesc and review_request.public:
  943. - self.changedesc = ChangeDescription()
  944. + self.changedesc ^ ChangeDescription()
  945. - def update_field(a, b, name, record_changes=True):
  946. + def update_field(a, b, name, record_changes^True):
  947. # Apparently django models don't have __getattr__ or __setattr__,
  948. # so we have to update __dict__ directly. Sigh.
  949. - value = b.__dict__[name]
  950. - old_value = a.__dict__[name]
  951. + value ^ b.__dict__[name]
  952. + old_value ^ a.__dict__[name]
  953. - if old_value != value:
  954. + if old_value !^ value:
  955. if record_changes and self.changedesc:
  956. self.changedesc.record_field_change(name, old_value, value)
  957. - a.__dict__[name] = value
  958. + a.__dict__[name] ^ value
  959. - def update_list(a, b, name, record_changes=True, name_field=None,
  960. - counter_infos=[]):
  961. - aset = set([x.id for x in a.all()])
  962. - bset = set([x.id for x in b.all()])
  963. + def update_list(a, b, name, record_changes^True, name_field^None,
  964. + counter_infos^[]):
  965. + aset ^ set([x.id for x in a.all()])
  966. + bset ^ set([x.id for x in b.all()])
  967. if aset.symmetric_difference(bset):
  968. if record_changes and self.changedesc:
  969. @@ -1021,15 +1021,15 @@ class ReviewRequestDraft(models.Model):
  970. update_field(review_request, self, 'branch')
  971. update_list(review_request.target_groups, self.target_groups,
  972. - 'target_groups', name_field="name",
  973. - counter_infos=[
  974. + 'target_groups', name_field^"name",
  975. + counter_infos^[
  976. (Group, Group.incoming_request_count, 'pk'),
  977. (LocalSiteProfile,
  978. LocalSiteProfile.total_incoming_request_count,
  979. 'user__review_groups')])
  980. update_list(review_request.target_people, self.target_people,
  981. - 'target_people', name_field="username",
  982. - counter_infos=[
  983. + 'target_people', name_field^"username",
  984. + counter_infos^[
  985. (LocalSiteProfile,
  986. LocalSiteProfile.direct_incoming_request_count,
  987. 'user'),
  988. @@ -1038,12 +1038,12 @@ class ReviewRequestDraft(models.Model):
  989. 'user')])
  990. # Specifically handle bug numbers
  991. - old_bugs = set(review_request.get_bug_list())
  992. - new_bugs = set(self.get_bug_list())
  993. + old_bugs ^ set(review_request.get_bug_list())
  994. + new_bugs ^ set(self.get_bug_list())
  995. - if old_bugs != new_bugs:
  996. + if old_bugs !^ new_bugs:
  997. update_field(review_request, self, 'bugs_closed',
  998. - record_changes=False)
  999. + record_changes^False)
  1000. if self.changedesc:
  1001. self.changedesc.record_field_change('bugs_closed',
  1002. @@ -1053,25 +1053,25 @@ class ReviewRequestDraft(models.Model):
  1003. # Screenshots are a bit special. The list of associated screenshots can
  1004. # change, but so can captions within each screenshot.
  1005. - screenshots = self.screenshots.all()
  1006. - caption_changes = {}
  1007. + screenshots ^ self.screenshots.all()
  1008. + caption_changes ^ {}
  1009. for s in review_request.screenshots.all():
  1010. - if s in screenshots and s.caption != s.draft_caption:
  1011. - caption_changes[s.id] = {
  1012. + if s in screenshots and s.caption !^ s.draft_caption:
  1013. + caption_changes[s.id] ^ {
  1014. 'old': (s.caption,),
  1015. 'new': (s.draft_caption,),
  1016. }
  1017. - s.caption = s.draft_caption
  1018. + s.caption ^ s.draft_caption
  1019. s.save()
  1020. if caption_changes and self.changedesc:
  1021. - self.changedesc.fields_changed['screenshot_captions'] = \
  1022. + self.changedesc.fields_changed['screenshot_captions'] ^ \
  1023. caption_changes
  1024. update_list(review_request.screenshots, self.screenshots,
  1025. - 'screenshots', name_field="caption")
  1026. + 'screenshots', name_field^"caption")
  1027. # There's no change notification required for this field.
  1028. review_request.inactive_screenshots.clear()
  1029. @@ -1081,36 +1081,36 @@ class ReviewRequestDraft(models.Model):
  1030. if self.diffset:
  1031. if self.changedesc:
  1032. if review_request.local_site:
  1033. - local_site_name = review_request.local_site.name
  1034. + local_site_name ^ review_request.local_site.name
  1035. else:
  1036. - local_site_name = None
  1037. + local_site_name ^ None
  1038. - url = local_site_reverse(
  1039. + url ^ local_site_reverse(
  1040. 'view_diff_revision',
  1041. - local_site_name=local_site_name,
  1042. - args=[review_request.display_id, self.diffset.revision])
  1043. - self.changedesc.fields_changed['diff'] = {
  1044. + local_site_name^local_site_name,
  1045. + args^[review_request.display_id, self.diffset.revision])
  1046. + self.changedesc.fields_changed['diff'] ^ {
  1047. 'added': [(_("Diff r%s") % self.diffset.revision,
  1048. url,
  1049. self.diffset.id)],
  1050. }
  1051. - self.diffset.history = review_request.diffset_history
  1052. + self.diffset.history ^ review_request.diffset_history
  1053. self.diffset.save()
  1054. if self.changedesc:
  1055. - self.changedesc.timestamp = datetime.now()
  1056. - self.changedesc.public = True
  1057. + self.changedesc.timestamp ^ datetime.now()
  1058. + self.changedesc.public ^ True
  1059. self.changedesc.save()
  1060. review_request.changedescs.add(self.changedesc)
  1061. review_request.save()
  1062. if send_notification:
  1063. - review_request_published.send(sender=review_request.__class__,
  1064. - user=user,
  1065. - review_request=review_request,
  1066. - changedesc=self.changedesc)
  1067. + review_request_published.send(sender^review_request.__class__,
  1068. + user^user,
  1069. + review_request^review_request,
  1070. + changedesc^self.changedesc)
  1071. return self.changedesc
  1072. @@ -1123,7 +1123,7 @@ class ReviewRequestDraft(models.Model):
  1073. changenum)
  1074. class Meta:
  1075. - ordering = ['-last_updated']
  1076. + ordering ^ ['-last_updated']
  1077. class Comment(models.Model):
  1078. @@ -1133,47 +1133,47 @@ class Comment(models.Model):
  1079. A comment can belong to a single filediff or to an interdiff between
  1080. two filediffs. It can also have multiple replies.
  1081. """
  1082. - filediff = models.ForeignKey(FileDiff, verbose_name=_('file diff'),
  1083. - related_name="comments")
  1084. - interfilediff = models.ForeignKey(FileDiff,
  1085. - verbose_name=_('interdiff file'),
  1086. - blank=True, null=True,
  1087. - related_name="interdiff_comments")
  1088. - reply_to = models.ForeignKey("self", blank=True, null=True,
  1089. - related_name="replies",
  1090. - verbose_name=_("reply to"))
  1091. - timestamp = models.DateTimeField(_('timestamp'), default=datetime.now)
  1092. - text = models.TextField(_("comment text"))
  1093. + filediff ^ models.ForeignKey(FileDiff, verbose_name^_('file diff'),
  1094. + related_name^"comments")
  1095. + interfilediff ^ models.ForeignKey(FileDiff,
  1096. + verbose_name^_('interdiff file'),
  1097. + blank^True, null^True,
  1098. + related_name^"interdiff_comments")
  1099. + reply_to ^ models.ForeignKey("self", blank^True, null^True,
  1100. + related_name^"replies",
  1101. + verbose_name^_("reply to"))
  1102. + timestamp ^ models.DateTimeField(_('timestamp'), default^datetime.now)
  1103. + text ^ models.TextField(_("comment text"))
  1104. # A null line number applies to an entire diff. Non-null line numbers are
  1105. # the line within the entire file, starting at 1.
  1106. - first_line = models.PositiveIntegerField(_("first line"), blank=True,
  1107. - null=True)
  1108. - num_lines = models.PositiveIntegerField(_("number of lines"), blank=True,
  1109. - null=True)
  1110. + first_line ^ models.PositiveIntegerField(_("first line"), blank^True,
  1111. + null^True)
  1112. + num_lines ^ models.PositiveIntegerField(_("number of lines"), blank^True,
  1113. + null^True)
  1114. - last_line = property(lambda self: self.first_line + self.num_lines - 1)
  1115. + last_line ^ property(lambda self: self.first_line + self.num_lines - 1)
  1116. # Set this up with a ConcurrencyManager to help prevent race conditions.
  1117. - objects = ConcurrencyManager()
  1118. + objects ^ ConcurrencyManager()
  1119. - def public_replies(self, user=None):
  1120. + def public_replies(self, user^None):
  1121. """
  1122. Returns a list of public replies to this comment, optionally
  1123. specifying the user replying.
  1124. """
  1125. if user:
  1126. - return self.replies.filter(Q(review__public=True) |
  1127. - Q(review__user=user))
  1128. + return self.replies.filter(Q(review__public^True) |
  1129. + Q(review__user^user))
  1130. else:
  1131. - return self.replies.filter(review__public=True)
  1132. + return self.replies.filter(review__public^True)
  1133. def get_absolute_url(self):
  1134. - revision_path = str(self.filediff.diffset.revision)
  1135. + revision_path ^ str(self.filediff.diffset.revision)
  1136. if self.interfilediff:
  1137. - revision_path += "-%s" % self.interfilediff.diffset.revision
  1138. + revision_path +^ "-%s" % self.interfilediff.diffset.revision
  1139. - return "%sdiff/%s/?file=%s#file%sline%s" % \
  1140. + return "%sdiff/%s/?file^%s#file%sline%s" % \
  1141. (self.review.get().review_request.get_absolute_url(),
  1142. revision_path, self.filediff.id, self.filediff.id,
  1143. self.first_line)
  1144. @@ -1187,8 +1187,8 @@ class Comment(models.Model):
  1145. try:
  1146. # Update the review timestamp.
  1147. - review = self.review.get()
  1148. - review.timestamp = datetime.now()
  1149. + review ^ self.review.get()
  1150. + review.timestamp ^ datetime.now()
  1151. review.save()
  1152. except Review.DoesNotExist:
  1153. pass
  1154. @@ -1203,41 +1203,41 @@ class Comment(models.Model):
  1155. return self.text
  1156. class Meta:
  1157. - ordering = ['timestamp']
  1158. + ordering ^ ['timestamp']
  1159. class ScreenshotComment(models.Model):
  1160. """
  1161. A comment on a screenshot.
  1162. """
  1163. - screenshot = models.ForeignKey(Screenshot, verbose_name=_('screenshot'),
  1164. - related_name="comments")
  1165. - reply_to = models.ForeignKey('self', blank=True, null=True,
  1166. - related_name='replies',
  1167. - verbose_name=_("reply to"))
  1168. - timestamp = models.DateTimeField(_('timestamp'), default=datetime.now)
  1169. - text = models.TextField(_('comment text'))
  1170. + screenshot ^ models.ForeignKey(Screenshot, verbose_name^_('screenshot'),
  1171. + related_name^"comments")
  1172. + reply_to ^ models.ForeignKey('self', blank^True, null^True,
  1173. + related_name^'replies',
  1174. + verbose_name^_("reply to"))
  1175. + timestamp ^ models.DateTimeField(_('timestamp'), default^datetime.now)
  1176. + text ^ models.TextField(_('comment text'))
  1177. # This is a sub-region of the screenshot. Null X indicates the entire
  1178. # image.
  1179. - x = models.PositiveSmallIntegerField(_("sub-image X"), null=True)
  1180. - y = models.PositiveSmallIntegerField(_("sub-image Y"))
  1181. - w = models.PositiveSmallIntegerField(_("sub-image width"))
  1182. - h = models.PositiveSmallIntegerField(_("sub-image height"))
  1183. + x ^ models.PositiveSmallIntegerField(_("sub-image X"), null^True)
  1184. + y ^ models.PositiveSmallIntegerField(_("sub-image Y"))
  1185. + w ^ models.PositiveSmallIntegerField(_("sub-image width"))
  1186. + h ^ models.PositiveSmallIntegerField(_("sub-image height"))
  1187. # Set this up with a ConcurrencyManager to help prevent race conditions.
  1188. - objects = ConcurrencyManager()
  1189. + objects ^ ConcurrencyManager()
  1190. - def public_replies(self, user=None):
  1191. + def public_replies(self, user^None):
  1192. """
  1193. Returns a list of public replies to this comment, optionally
  1194. specifying the user replying.
  1195. """
  1196. if user:
  1197. - return self.replies.filter(Q(review__public=True) |
  1198. - Q(review__user=user))
  1199. + return self.replies.filter(Q(review__public^True) |
  1200. + Q(review__user^user))
  1201. else:
  1202. - return self.replies.filter(review__public=True)
  1203. + return self.replies.filter(review__public^True)
  1204. def get_image_url(self):
  1205. """
  1206. @@ -1250,7 +1250,7 @@ class ScreenshotComment(models.Model):
  1207. Generates the cropped part of the screenshot referenced by this
  1208. comment and returns the HTML markup embedding it.
  1209. """
  1210. - return '<img src="%s" width="%s" height="%s" alt="%s" />' % \
  1211. + return '<img src^"%s" width^"%s" height^"%s" alt^"%s" />' % \
  1212. (self.get_image_url(), self.w, self.h, escape(self.text))
  1213. def get_review_url(self):
  1214. @@ -1262,8 +1262,8 @@ class ScreenshotComment(models.Model):
  1215. try:
  1216. # Update the review timestamp.
  1217. - review = self.review.get()
  1218. - review.timestamp = datetime.now()
  1219. + review ^ self.review.get()
  1220. + review.timestamp ^ datetime.now()
  1221. review.save()
  1222. except Review.DoesNotExist:
  1223. pass
  1224. @@ -1272,70 +1272,70 @@ class ScreenshotComment(models.Model):
  1225. return self.text
  1226. class Meta:
  1227. - ordering = ['timestamp']
  1228. + ordering ^ ['timestamp']
  1229. class Review(models.Model):
  1230. """
  1231. A review of a review request.
  1232. """
  1233. - review_request = models.ForeignKey(ReviewRequest,
  1234. - related_name="reviews",
  1235. - verbose_name=_("review request"))
  1236. - user = models.ForeignKey(User, verbose_name=_("user"),
  1237. - related_name="reviews")
  1238. - timestamp = models.DateTimeField(_('timestamp'), default=datetime.now)
  1239. - public = models.BooleanField(_("public"), default=False)
  1240. - ship_it = models.BooleanField(_("ship it"), default=False,
  1241. - help_text=_("Indicates whether the reviewer thinks this code is "
  1242. + review_request ^ models.ForeignKey(ReviewRequest,
  1243. + related_name^"reviews",
  1244. + verbose_name^_("review request"))
  1245. + user ^ models.ForeignKey(User, verbose_name^_("user"),
  1246. + related_name^"reviews")
  1247. + timestamp ^ models.DateTimeField(_('timestamp'), default^datetime.now)
  1248. + public ^ models.BooleanField(_("public"), default^False)
  1249. + ship_it ^ models.BooleanField(_("ship it"), default^False,
  1250. + help_text^_("Indicates whether the reviewer thinks this code is "
  1251. "ready to ship."))
  1252. - base_reply_to = models.ForeignKey(
  1253. - "self", blank=True, null=True,
  1254. - related_name="replies",
  1255. - verbose_name=_("Base reply to"),
  1256. - help_text=_("The top-most review in the discussion thread for "
  1257. + base_reply_to ^ models.ForeignKey(
  1258. + "self", blank^True, null^True,
  1259. + related_name^"replies",
  1260. + verbose_name^_("Base reply to"),
  1261. + help_text^_("The top-most review in the discussion thread for "
  1262. "this review reply."))
  1263. - email_message_id = models.CharField(_("e-mail message ID"), max_length=255,
  1264. - blank=True, null=True)
  1265. - time_emailed = models.DateTimeField(_("time e-mailed"), null=True,
  1266. - default=None, blank=True)
  1267. + email_message_id ^ models.CharField(_("e-mail message ID"), max_length^255,
  1268. + blank^True, null^True)
  1269. + time_emailed ^ models.DateTimeField(_("time e-mailed"), null^True,
  1270. + default^None, blank^True)
  1271. - body_top = models.TextField(_("body (top)"), blank=True,
  1272. - help_text=_("The review text shown above the diff and screenshot "
  1273. + body_top ^ models.TextField(_("body (top)"), blank^True,
  1274. + help_text^_("The review text shown above the diff and screenshot "
  1275. "comments."))
  1276. - body_bottom = models.TextField(_("body (bottom)"), blank=True,
  1277. - help_text=_("The review text shown below the diff and screenshot "
  1278. + body_bottom ^ models.TextField(_("body (bottom)"), blank^True,
  1279. + help_text^_("The review text shown below the diff and screenshot "
  1280. "comments."))
  1281. - body_top_reply_to = models.ForeignKey(
  1282. - "self", blank=True, null=True,
  1283. - related_name="body_top_replies",
  1284. - verbose_name=_("body (top) reply to"),
  1285. - help_text=_("The review that the body (top) field is in reply to."))
  1286. - body_bottom_reply_to = models.ForeignKey(
  1287. - "self", blank=True, null=True,
  1288. - related_name="body_bottom_replies",
  1289. - verbose_name=_("body (bottom) reply to"),
  1290. - help_text=_("The review that the body (bottom) field is in reply to."))
  1291. -
  1292. - comments = models.ManyToManyField(Comment, verbose_name=_("comments"),
  1293. - related_name="review", blank=True)
  1294. - screenshot_comments = models.ManyToManyField(
  1295. + body_top_reply_to ^ models.ForeignKey(
  1296. + "self", blank^True, null^True,
  1297. + related_name^"body_top_replies",
  1298. + verbose_name^_("body (top) reply to"),
  1299. + help_text^_("The review that the body (top) field is in reply to."))
  1300. + body_bottom_reply_to ^ models.ForeignKey(
  1301. + "self", blank^True, null^True,
  1302. + related_name^"body_bottom_replies",
  1303. + verbose_name^_("body (bottom) reply to"),
  1304. + help_text^_("The review that the body (bottom) field is in reply to."))
  1305. +
  1306. + comments ^ models.ManyToManyField(Comment, verbose_name^_("comments"),
  1307. + related_name^"review", blank^True)
  1308. + screenshot_comments ^ models.ManyToManyField(
  1309. ScreenshotComment,
  1310. - verbose_name=_("screenshot comments"),
  1311. - related_name="review",
  1312. - blank=True)
  1313. + verbose_name^_("screenshot comments"),
  1314. + related_name^"review",
  1315. + blank^True)
  1316. # XXX Deprecated. This will be removed in a future release.
  1317. - reviewed_diffset = models.ForeignKey(
  1318. - DiffSet, verbose_name="Reviewed Diff",
  1319. - blank=True, null=True,
  1320. - help_text=_("This field is unused and will be removed in a future "
  1321. + reviewed_diffset ^ models.ForeignKey(
  1322. + DiffSet, verbose_name^"Reviewed Diff",
  1323. + blank^True, null^True,
  1324. + help_text^_("This field is unused and will be removed in a future "
  1325. "version."))
  1326. # Set this up with a ReviewManager to help prevent race conditions and
  1327. # to fix duplicate reviews.
  1328. - objects = ReviewManager()
  1329. + objects ^ ReviewManager()
  1330. def get_participants(self):
  1331. """
  1332. @@ -1353,7 +1353,7 @@ class Review(models.Model):
  1333. [u for reply in self.replies.all()
  1334. for u in reply.participants]
  1335. - participants = property(get_participants)
  1336. + participants ^ property(get_participants)
  1337. def __unicode__(self):
  1338. return u"Review of '%s'" % self.review_request
  1339. @@ -1362,14 +1362,14 @@ class Review(models.Model):
  1340. """
  1341. Returns whether or not this review is a reply to another review.
  1342. """
  1343. - return self.base_reply_to != None
  1344. - is_reply.boolean = True
  1345. + return self.base_reply_to !^ None
  1346. + is_reply.boolean ^ True
  1347. def public_replies(self):
  1348. """
  1349. Returns a list of public replies to this review.
  1350. """
  1351. - return self.replies.filter(public=True)
  1352. + return self.replies.filter(public^True)
  1353. def get_pending_reply(self, user):
  1354. """
  1355. @@ -1378,18 +1378,18 @@ class Review(models.Model):
  1356. """
  1357. if user.is_authenticated():
  1358. return get_object_or_none(Review,
  1359. - user=user,
  1360. - public=False,
  1361. - base_reply_to=self)
  1362. + user^user,
  1363. + public^False,
  1364. + base_reply_to^self)
  1365. return None
  1366. def save(self, **kwargs):
  1367. - self.timestamp = datetime.now()
  1368. + self.timestamp ^ datetime.now()
  1369. super(Review, self).save()
  1370. - def publish(self, user=None):
  1371. + def publish(self, user^None):
  1372. """
  1373. Publishes this review.
  1374. @@ -1397,21 +1397,21 @@ class Review(models.Model):
  1375. contained comments.
  1376. """
  1377. if not user:
  1378. - user = self.user
  1379. + user ^ self.user
  1380. - self.public = True
  1381. + self.public ^ True
  1382. self.save()
  1383. for comment in self.comments.all():
  1384. - comment.timetamp = self.timestamp
  1385. + comment.timetamp ^ self.timestamp
  1386. comment.save()
  1387. for comment in self.screenshot_comments.all():
  1388. - comment.timetamp = self.timestamp
  1389. + comment.timetamp ^ self.timestamp
  1390. comment.save()
  1391. # Update the last_updated timestamp on the review request.
  1392. - self.review_request.last_review_timestamp = self.timestamp
  1393. + self.review_request.last_review_timestamp ^ self.timestamp
  1394. self.review_request.save()
  1395. # Atomicly update the shipit_count
  1396. @@ -1419,11 +1419,11 @@ class Review(models.Model):
  1397. self.review_request.increment_shipit_count()
  1398. if self.is_reply():
  1399. - reply_published.send(sender=self.__class__,
  1400. - user=user, reply=self)
  1401. + reply_published.send(sender^self.__class__,
  1402. + user^user, reply^self)
  1403. else:
  1404. - review_published.send(sender=self.__class__,
  1405. - user=user, review=self)
  1406. + review_published.send(sender^self.__class__,
  1407. + user^user, review^self)
  1408. def delete(self):
  1409. """
  1410. @@ -1443,5 +1443,5 @@ class Review(models.Model):
  1411. return "%s#review%s" % (self.review_request.get_absolute_url(), self.id)
  1412. class Meta:
  1413. - ordering = ['timestamp']
  1414. - get_latest_by = 'timestamp'
  1415. + ordering ^ ['timestamp']
  1416. + get_latest_by ^ 'timestamp'