From 3a211b74a410f78ecb4102d4019b035e2f8181a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Sat, 9 Aug 2014 01:13:42 -0700 Subject: [PATCH] pep8 --- issue/backends.py | 3 +- issue/context_processors.py | 8 +- issue/forms.py | 28 ++-- issue/middleware.py | 13 +- issue/models.py | 86 +++++++---- issue/signals.py | 2 +- issue/templatetags/issue_filters.py | 4 +- issue/templatetags/issue_tags.py | 12 +- issue/urls.py | 2 +- issue/views.py | 215 ++++++++++++++++------------ ponytracker/settings.py | 6 +- ponytracker/urls.py | 2 +- tox.ini | 3 + 13 files changed, 238 insertions(+), 146 deletions(-) create mode 100644 tox.ini diff --git a/issue/backends.py b/issue/backends.py index ccf29d0..7bca04e 100644 --- a/issue/backends.py +++ b/issue/backends.py @@ -5,10 +5,11 @@ from issue.models import * def user_has_perm(user, perm, perms): for p in perms: - # this permission allow that action and the user is concerned by this permission + # this perm allow that action and the user is concerned by this perm if hasattr(p, perm) and getattr(p, perm) and p.granted_to(user): return True + class ProjectBackend(ModelBackend): def has_perm(self, user, perm, obj=None): diff --git a/issue/context_processors.py b/issue/context_processors.py index 5aadec4..716838d 100644 --- a/issue/context_processors.py +++ b/issue/context_processors.py @@ -15,6 +15,7 @@ class PermissionChecker: if request.user.is_authenticated(): return request.user.has_perm(perm, obj) + class PermWrapper: def __init__(self, user): @@ -29,10 +30,7 @@ class PermWrapper: def __contains__(self, perm): return self[perm] + def can_user(request): - wrapper = PermWrapper(request.user) - - return { - 'can_user': wrapper, - } + return {'can_user': wrapper} diff --git a/issue/forms.py b/issue/forms.py index 9e72c3f..bae4d20 100644 --- a/issue/forms.py +++ b/issue/forms.py @@ -6,26 +6,34 @@ from django_markdown.widgets import MarkdownWidget from issue.models import * -AddProjectForm = modelform_factory(Project, fields=['display_name', 'name', 'description', 'public']) -EditProjectForm = modelform_factory(Project, fields=['display_name', 'description', 'public']) -LabelForm = modelform_factory(Label, fields=['name', 'color', 'inverted']) + +AddProjectForm = modelform_factory(Project, + fields=['display_name', 'name', 'description', 'public']) +EditProjectForm = modelform_factory(Project, + fields=['display_name', 'description', 'public']) +LabelForm = modelform_factory(Label, + fields=['name', 'color', 'inverted']) + class MilestoneForm(forms.ModelForm): class Meta: model = Milestone fields = ['name', 'due_date'] - widgets = { - 'due_date': DateTimePicker(format="YYYY-MM-DD HH:mm"), + widgets = { + 'due_date': DateTimePicker(format="YYYY-MM-DD HH:mm"), } + class IssueForm(forms.Form): title = forms.CharField(max_length=128) description = forms.CharField(widget=MarkdownWidget, required=False) + class CommentForm(forms.Form): comment = forms.CharField(widget=MarkdownWidget) + class PermissionForm(forms.ModelForm): class Meta: @@ -37,7 +45,7 @@ class PermissionForm(forms.ModelForm): data = super(PermissionForm, self).clean() - if not 'grantee_name' in data or not 'grantee_type' in data: + if 'grantee_name' not in data or 'grantee_type' not in data: # a field required error will be printed so we dont care return data @@ -45,22 +53,24 @@ class PermissionForm(forms.ModelForm): if int(data['grantee_type']) == PermissionModel.GRANTEE_USER: if not User.objects.filter(username=name).exists(): - raise ValidationError("User '%s' does not exists." %name) + raise ValidationError("User '%s' does not exists." % name) elif int(data['grantee_type']) == PermissionModel.GRANTEE_GROUP: if not Group.objects.filter(name=name).exists(): - raise ValidationError("Group '%s' does not exists." %name) + raise ValidationError("Group '%s' does not exists." % name) elif int(data['grantee_type']) == PermissionModel.GRANTEE_TEAM: if not Team.objects.filter(name=name).exists(): - raise ValidationError("Team '%s' does not exists." %name) + raise ValidationError("Team '%s' does not exists." % name) return data + class GlobalPermissionForm(PermissionForm): class Meta: model = GlobalPermission exclude = [] + class ProjectPermissionForm(PermissionForm): class Meta: diff --git a/issue/middleware.py b/issue/middleware.py index c445fab..fed5ce4 100644 --- a/issue/middleware.py +++ b/issue/middleware.py @@ -5,6 +5,7 @@ from django.contrib.auth.decorators import login_required from django.db.models import Q from issue.models import * +from issue.models import PermissionModel as PermModel class ProjectMiddleware: @@ -35,13 +36,15 @@ class ProjectMiddleware: query = Q(public=True) if user: # access granted through a team - query |= Q(permissions__grantee_type=PermissionModel.GRANTEE_TEAM, - permissions__grantee_name__in=user.teams.values_list('name')) + teams = user.teams.values_list('name') + query |= Q(permissions__grantee_type=PermModel.GRANTEE_TEAM, + permissions__grantee_name__in=teams) # access granted through a group - query |= Q(permissions__grantee_type=PermissionModel.GRANTEE_GROUP, - permissions__grantee_name__in=user.groups.values_list('name')) + groups = user.groups.values_list('name') + query |= Q(permissions__grantee_type=PermModel.GRANTEE_GROUP, + permissions__grantee_name__in=groups) # access granted by specific permission - query |= Q(permissions__grantee_type=PermissionModel.GRANTEE_USER, + query |= Q(permissions__grantee_type=PermModel.GRANTEE_USER, permissions__grantee_name=user.username) projects = Project.objects.filter(query).distinct() request.projects = projects diff --git a/issue/models.py b/issue/models.py index b347367..290c369 100644 --- a/issue/models.py +++ b/issue/models.py @@ -25,7 +25,9 @@ class User(auth.models.User): @property def teams(self): - return Team.objects.filter(Q(groups__in=self.groups.all()) | Q(users=self)) + query = Q(groups__in=self.groups.all()) | Q(users=self) + return Team.objects.filter(query) + class Project(models.Model): @@ -44,12 +46,14 @@ class Project(models.Model): verbose_name="Description") public = models.BooleanField(default=True, - verbose_name="Do unregistered users have read access to this project?") + verbose_name="Do unregistered users have read access " + "to this project?") def __str__(self): return self.display_name + class Label(models.Model): project = models.ForeignKey(Project, related_name='labels') @@ -58,9 +62,11 @@ class Label(models.Model): deleted = models.BooleanField(default=False) - color = RGBColorField(default='#000000', verbose_name="Background color") + color = RGBColorField(default='#000000', + verbose_name="Background color") - inverted = models.BooleanField(default=True, verbose_name="Inverse text color") + inverted = models.BooleanField(default=True, + verbose_name="Inverse text color") @property def quotted_name(self): @@ -73,6 +79,7 @@ class Label(models.Model): def __str__(self): return self.name + class Milestone(models.Model): name_validator = RegexValidator(regex='^[a-z0-9_.-]+$', @@ -84,9 +91,9 @@ class Milestone(models.Model): name = models.CharField(max_length=32, validators=[name_validator]) class Meta: - unique_together = [ 'project', 'name' ] + unique_together = ['project', 'name'] - due_date = models.DateTimeField(blank=True,null=True) + due_date = models.DateTimeField(blank=True, null=True) closed = models.BooleanField(default=False) @@ -104,22 +111,23 @@ class Milestone(models.Model): total = self.total_issues() if total: - return int(100 * closed / total); + return int(100 * closed / total) else: return 0 def __str__(self): return self.name + class Issue(models.Model): global_id = models.AutoField(primary_key=True) - + project = models.ForeignKey(Project, related_name='issues') id = models.IntegerField(editable=False) class Meta: - unique_together = [ 'project', 'id' ] + unique_together = ['project', 'id'] title = models.CharField(max_length=128) @@ -129,9 +137,11 @@ class Issue(models.Model): closed = models.BooleanField(default=False) - labels = models.ManyToManyField(Label, blank=True, null=True, related_name='issues') + labels = models.ManyToManyField(Label, blank=True, null=True, + related_name='issues') - milestone = models.ForeignKey(Milestone, blank=True, null=True, related_name='issues') + milestone = models.ForeignKey(Milestone, blank=True, null=True, + related_name='issues') assignee = models.ForeignKey(User, blank=True, null=True, related_name='+') @@ -146,18 +156,19 @@ class Issue(models.Model): def comments(self): - comments = self.events.filter(issue=self,code=Event.COMMENT) + comments = self.events.filter(issue=self, code=Event.COMMENT) return comments def getdesc(self): - desc = self.events.filter(issue=self,code=Event.DESCRIBE) + desc = self.events.filter(issue=self, code=Event.DESCRIBE) if desc.exists(): return desc.first().additionnal_section else: return None + def setdesc(self, value): - desc = self.events.filter(issue=self,code=Event.DESCRIBE) + desc = self.events.filter(issue=self, code=Event.DESCRIBE) if desc.exists(): desc = desc.first() desc.additionnal_section = value @@ -166,8 +177,9 @@ class Issue(models.Model): desc = Event(issue=self, author=self.author, code=Event.DESCRIBE, additionnal_section=value) desc.save() + def deldesc(self): - desc = self.events.filter(issue=self,code=Event.DESCRIBE) + desc = self.events.filter(issue=self, code=Event.DESCRIBE) if desc.exists(): desc.first().delete() description = property(getdesc, setdesc, deldesc) @@ -194,12 +206,14 @@ class Issue(models.Model): if self.milestone == milestone: return if self.milestone: - event = Event(issue=self, author=author, code=Event.CHANGE_MILESTONE, + event = Event(issue=self, author=author, + code=Event.CHANGE_MILESTONE, args={'old_milestone': self.milestone.name, 'new_milestone': milestone.name}) event.save() else: - event = Event(issue=self, author=author, code=Event.SET_MILESTONE, + event = Event(issue=self, author=author, + code=Event.SET_MILESTONE, args={'milestone': milestone.name}) event.save() self.milestone = milestone @@ -210,13 +224,15 @@ class Issue(models.Model): self.milestone = None if commit: self.save() - event = Event(issue=self, author=author, code=Event.UNSET_MILESTONE, + event = Event(issue=self, author=author, + code=Event.UNSET_MILESTONE, args={'milestone': milestone.name}) event.save() def __str__(self): return self.title + @python_2_unicode_compatible class Event(models.Model): @@ -240,15 +256,17 @@ class Event(models.Model): date = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(User) - + code = models.IntegerField(default=UNKNOW) _args = models.CharField(max_length=1024, blank=True, default="{}") def getargs(self): return json.loads(self._args) + def setargs(self, args): self._args = json.dumps(args) + def delargs(self): self._args = "{}" args = property(getargs, setargs, delargs) @@ -297,18 +315,21 @@ class Event(models.Model): elif self.code == Event.REOPEN: description = "reopened this issue" elif self.code == Event.RENAME: - description = "changed the title from {old_title} to {new_title}" + description = "changed the title from {old_title} " \ + "to {new_title}" elif self.code == Event.ADD_LABEL or self.code == Event.DEL_LABEL: label = Label.objects.get(id=args['label']) if self.code == Event.ADD_LABEL: action = 'added' else: action = 'removed' - description = '%s the %s label' %(action, same_label(label), labeled(label)) + description = '%s the %s label' \ + % (action, same_label(label), labeled(label)) elif self.code == Event.SET_MILESTONE: description = "added this to the {milestone} milestone" elif self.code == Event.CHANGE_MILESTONE: - description = "moved this from the {old_milestone} milestone to the {new_milestone} milestone" + description = "moved this from the {old_milestone} milestone " \ + "to the {new_milestone} milestone" elif self.code == Event.UNSET_MILESTONE: description = "deleted this from the {milestone} milestone" elif self.code == Event.REFERENCE: @@ -321,6 +342,7 @@ class Event(models.Model): return mark_safe(description.format(**safe_args)) + class Settings(models.Model): site = models.OneToOneField(Site) @@ -328,16 +350,20 @@ class Settings(models.Model): class Meta: verbose_name_plural = 'Settings' + class Team(models.Model): name = models.CharField(max_length=128, unique=True) - users = models.ManyToManyField(auth.models.User, blank=True, null=True, related_name='teams') - groups = models.ManyToManyField(auth.models.Group, blank=True, null=True, related_name='teams') + users = models.ManyToManyField(auth.models.User, blank=True, null=True, + related_name='teams') + groups = models.ManyToManyField(auth.models.Group, blank=True, null=True, + related_name='teams') def __str__(self): return self.name + class PermissionModel(models.Model): GRANTEE_USER = 0 @@ -364,8 +390,8 @@ class PermissionModel(models.Model): return user.groups.filter(name=self.grantee_name).exists() elif self.grantee_type == self.GRANTEE_TEAM: return Team.objects.filter(name=self.grantee_name) \ - .filter(Q(groups__in=user.groups.all()) | Q(users=user)) \ - .exists() + .filter(Q(groups__in=user.groups.all()) | Q(users=user)) \ + .exists() else: return False @@ -378,6 +404,7 @@ class PermissionModel(models.Model): def __str__(self): return self.grantee_name + class GlobalPermission(PermissionModel): create_project = models.BooleanField(default=True) @@ -392,9 +419,11 @@ class GlobalPermission(PermissionModel): def __str__(self): return self.grantee_name + "'s global permissions" + class ProjectPermission(PermissionModel): - project = models.ForeignKey(Project, related_name='permissions', editable=False) + project = models.ForeignKey(Project, editable=False, + related_name='permissions') create_issue = models.BooleanField(default=True) modify_issue = models.BooleanField(default=False) @@ -413,4 +442,5 @@ class ProjectPermission(PermissionModel): delete_milestone = models.BooleanField(default=False) def __str__(self): - return self.grantee_name + "'s permissions on " + self.project.name + " project" + return self.grantee_name + "'s permissions on " \ + + self.project.name + " project" diff --git a/issue/signals.py b/issue/signals.py index 01e9859..b791005 100644 --- a/issue/signals.py +++ b/issue/signals.py @@ -4,7 +4,7 @@ from django.dispatch import receiver from issue.models import Project, Label -@receiver(post_save, sender=Project, dispatch_uid="Create default project labels.") +@receiver(post_save, sender=Project, dispatch_uid="Default project labels.") def create_default_project_labels(sender, **kwargs): if kwargs['created']: project = kwargs['instance'] diff --git a/issue/templatetags/issue_filters.py b/issue/templatetags/issue_filters.py index 5958ccd..8832f3d 100644 --- a/issue/templatetags/issue_filters.py +++ b/issue/templatetags/issue_filters.py @@ -4,10 +4,12 @@ from django.utils.safestring import mark_safe register = template.Library() + @register.filter def boolean(value): if value: glyph = 'ok' else: glyph = 'remove' - return mark_safe('') + return mark_safe('') diff --git a/issue/templatetags/issue_tags.py b/issue/templatetags/issue_tags.py index ec60696..87d59ae 100644 --- a/issue/templatetags/issue_tags.py +++ b/issue/templatetags/issue_tags.py @@ -6,6 +6,7 @@ from django.utils.html import escape register = template.Library() + @register.simple_tag def label_style(label): @@ -18,12 +19,16 @@ def label_style(label): return style.format(bg=label.color, fg=fg) + @register.simple_tag def labeled(label): - html = '{name}' + html = '{name}' + + return mark_safe(html.format(style=label_style(label), + name=escape(label.name))) - return mark_safe(html.format(style=label_style(label),name=escape(label.name))) @register.simple_tag def same_label(label): @@ -33,6 +38,7 @@ def same_label(label): return mark_safe(url) + @register.simple_tag def same_milestone(milestone): @@ -41,6 +47,7 @@ def same_milestone(milestone): return mark_safe(url) + @register.simple_tag(takes_context=True) def same_author(context, author): @@ -49,6 +56,7 @@ def same_author(context, author): return mark_safe(url) + @register.simple_tag def vertical(string): return string.replace("", "\0").strip("\0").replace("\0", "
") diff --git a/issue/urls.py b/issue/urls.py index b3bd4ec..8bdc4fd 100644 --- a/issue/urls.py +++ b/issue/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.conf.urls import url urlpatterns = [ url(r'^$', 'issue.views.project_list', name='list-project'), diff --git a/issue/views.py b/issue/views.py index 724e9e2..e2233c2 100644 --- a/issue/views.py +++ b/issue/views.py @@ -14,22 +14,24 @@ def profile(request): user = User.objects.get(username=request.user) c = { - 'groups': user.groups.all(), - 'teams': user.teams.all(), - } + 'groups': user.groups.all(), + 'teams': user.teams.all(), + } return render(request, 'issue/profile.html', c) + def global_permission_list(request): permissions = GlobalPermission.objects.all() c = { - 'permissions': permissions, + 'permissions': permissions, } return render(request, 'issue/global_permission_list.html', c) + def global_permission_edit(request, id=None): if id: @@ -53,17 +55,18 @@ def global_permission_edit(request, id=None): return redirect('list-global-permission') c = { - 'form': form, - } + 'form': form, + } return render(request, 'issue/global_permission_edit.html', c) + def global_permission_toggle(request, id, perm): permission = get_object_or_404(GlobalPermission, id=id) # to be sure to dont modify other attribut with the following trick - if not '-' in perm: + if '-' not in perm: raise Http404 perm = perm.replace('-', '_') @@ -76,6 +79,7 @@ def global_permission_toggle(request, id, perm): return redirect('list-global-permission') + def global_permission_delete(request, id): permission = get_object_or_404(GlobalPermission, id=id) @@ -86,21 +90,24 @@ def global_permission_delete(request, id): return redirect('list-global-permission') + def project_permission_list(request, project): permissions = ProjectPermission.objects.filter(project=project) c = { - 'project': project, - 'permissions': permissions, + 'project': project, + 'permissions': permissions, } return render(request, 'issue/project_permission_list.html', c) + def project_permission_edit(request, project, id=None): if id: - permission = get_object_or_404(ProjectPermission, project=project, id=id) + permission = get_object_or_404(ProjectPermission, + project=project, id=id) else: permission = None @@ -119,18 +126,19 @@ def project_permission_edit(request, project, id=None): return redirect('list-project-permission', project.name) c = { - 'project': project, - 'form': form, - } + 'project': project, + 'form': form, + } return render(request, 'issue/project_permission_edit.html', c) + def project_permission_toggle(request, project, id, perm): permission = get_object_or_404(ProjectPermission, project=project, id=id) # to be sure to dont modify other attribut with the following trick - if not '-' in perm: + if '-' not in perm: raise Http404 perm = perm.replace('-', '_') @@ -143,6 +151,7 @@ def project_permission_toggle(request, project, id, perm): return redirect('list-project-permission', project.name) + def project_permission_delete(request, project, id): permission = get_object_or_404(ProjectPermission, project=project, id=id) @@ -153,6 +162,7 @@ def project_permission_delete(request, project, id): return redirect('list-project-permission', project.name) + def project_list(request): if not request.projects.exists(): @@ -163,59 +173,53 @@ def project_list(request): return render(request, 'issue/project_list.html') + def project_add(request): form = AddProjectForm(request.POST or None) if request.method == 'POST' and form.is_valid(): - if Project.objects \ - .filter(display_name__iexact=form.cleaned_data['display_name']) \ - .exists(): - - form._errors['display_name'] = ['There is already a project with a similar name.'] - + name = form.cleaned_data['display_name'] + if Project.objects.filter(display_name__iexact=name).exists(): + form._errors['display_name'] = ['There is already a project ' + 'with a similar name.'] else: - project = form.save() - messages.success(request, 'Project added successfully.') - return redirect('list-issue', project.name) c = { - 'form': form, - } + 'form': form, + } return render(request, 'issue/project_add.html', c) + def project_edit(request, project): form = EditProjectForm(request.POST or None, instance=project) if request.method == 'POST' and form.is_valid(): - if Project.objects \ - .filter(display_name__iexact=form.cleaned_data['display_name']) \ + name = form.cleaned_data['display_name'] + if Project.objects.filter(display_name__iexact=name) \ .exclude(pk=project.pk).exists(): - - form._errors['display_name'] = ['There is already a project with a similar name.'] - + form._errors['display_name'] = ['There is already a project ' + 'with a similar name.'] else: - project = form.save() - messages.success(request, 'Project modified successfully.') - return redirect('list-issue', project.name) c = { - 'project': project, - 'form': form, - } + 'project': project, + 'form': form, + } return render(request, 'issue/project_edit.html', c) + def project_delete(request, project): project.delete() @@ -224,6 +228,7 @@ def project_delete(request, project): return redirect('list-project') + def issue_list(request, project): issues = project.issues @@ -261,19 +266,22 @@ def issue_list(request, project): if value == 'open': issues = issues.filter(closed=False) is_open = ' active' - elif value =='close': + elif value == 'close': issues = issues.filter(closed=True) is_close = ' active' else: - messages.error(request, "The keyword 'is' must be followed by 'open' or 'close'.") + messages.error(request, "The keyword 'is' must be followed " + "by 'open' or 'close'.") issues = None break elif key == 'label': try: - label = Label.objects.get(project=project,name=value,deleted=False) + label = Label.objects.get(project=project, + name=value, deleted=False) except ObjectDoesNotExist: - messages.error(request, "The label '%s' does not exist or has been deleted." %value) + messages.error(request, "The label '%s' does not exist " + "or has been deleted." % value) issues = None break else: @@ -281,9 +289,10 @@ def issue_list(request, project): elif key == 'milestone': try: - milestone = Milestone.objects.get(project=project,name=value) + milestone = Milestone.objects.get(project=project, name=value) except ObjectDoesNotExist: - messages.error(request, "The milestone '%s' does not exist." %value) + messages.error(request, "The milestone '%s' does not exist." + % value) issues = None break else: @@ -293,12 +302,13 @@ def issue_list(request, project): if User.objects.filter(username=value).exists(): issues = issues.filter(author__username=value) else: - messages.error(request, "The user '%s' does not exist." %value) + messages.error(request, "The user '%s' does not exist." + % value) issues = None break else: - messages.error(request, "Unknow '%s' filtering criterion." %key) + messages.error(request, "Unknow '%s' filtering criterion." % key) issues = None break @@ -312,17 +322,18 @@ def issue_list(request, project): is_all = ' active' c = { - 'project': project, - 'issues': issues, - 'query': query, - 'is_open': is_open, - 'is_close': is_close, - 'is_all': is_all, - 'is_all_query': is_all_query[1:], - } + 'project': project, + 'issues': issues, + 'query': query, + 'is_open': is_open, + 'is_close': is_close, + 'is_all': is_all, + 'is_all_query': is_all_query[1:], + } return render(request, 'issue/issue_list.html', c) + def issue_edit(request, project, issue=None): if issue: @@ -375,19 +386,20 @@ def issue_edit(request, project, issue=None): return redirect('show-issue', project.name, issue.id) c = { - 'project': project, - 'form': form, - 'issue': issue, - } + 'project': project, + 'form': form, + 'issue': issue, + } return render(request, 'issue/issue_edit.html', c) + def issue(request, project, issue): issue = get_object_or_404(Issue, project=project, id=issue) labels = Label.objects.filter(project=project, deleted=False) \ - .exclude(id__in=issue.labels.all().values_list('id')) + .exclude(id__in=issue.labels.all().values_list('id')) milestones = Milestone.objects.filter(project=project) if issue.milestone: milestones = milestones.exclude(name=issue.milestone.name) @@ -395,22 +407,24 @@ def issue(request, project, issue): events = issue.events.all() c = { - 'labels': labels, - 'milestones': milestones, - 'project': project, - 'issue': issue, - 'events': events, - } + 'labels': labels, + 'milestones': milestones, + 'project': project, + 'issue': issue, + 'events': events, + } return render(request, 'issue/issue.html', c) + def issue_comment(request, project, issue, comment=None): issue = get_object_or_404(Issue, project=project, id=issue) if comment: - event = get_object_or_404(Event, code=Event.COMMENT, issue=issue, id=comment) - init_data = { 'comment': event.additionnal_section } + event = get_object_or_404(Event, code=Event.COMMENT, + issue=issue, id=comment) + init_data = {'comment': event.additionnal_section} else: event = None init_data = None @@ -433,7 +447,7 @@ def issue_comment(request, project, issue, comment=None): else: author = User.objects.get(username=request.user.username) - event = Event(issue=issue, author=author, + event = Event(issue=issue, author=author, code=Event.COMMENT, additionnal_section=comment) event.save() messages.success(request, 'Comment added successfully.') @@ -441,13 +455,14 @@ def issue_comment(request, project, issue, comment=None): return redirect('show-issue', project.name, issue.id) c = { - 'project': project, - 'issue': issue, - 'form': form, - } + 'project': project, + 'issue': issue, + 'form': form, + } return render(request, 'issue/issue_comment.html', c) + def issue_close(request, project, issue): issue = get_object_or_404(Issue, project=project, id=issue, closed=False) @@ -461,6 +476,7 @@ def issue_close(request, project, issue): return redirect('list-issue', project.name) + def issue_reopen(request, project, issue): issue = get_object_or_404(Issue, project=project, id=issue, closed=True) @@ -474,6 +490,7 @@ def issue_reopen(request, project, issue): return redirect('show-issue', project.name, issue.id) + def issue_delete(request, project, issue): issue = get_object_or_404(Issue, project=project, id=issue) @@ -484,6 +501,7 @@ def issue_delete(request, project, issue): return redirect('list-issue', project.name) + def issue_add_label(request, project, issue, label): issue = get_object_or_404(Issue, project=project, id=issue) @@ -494,6 +512,7 @@ def issue_add_label(request, project, issue, label): return redirect('show-issue', project.name, issue.id) + def issue_remove_label(request, project, issue, label): issue = get_object_or_404(Issue, project=project, id=issue) @@ -504,6 +523,7 @@ def issue_remove_label(request, project, issue, label): return redirect('show-issue', project.name, issue.id) + def issue_add_milestone(request, project, issue, milestone): issue = get_object_or_404(Issue, project=project, id=issue) @@ -514,6 +534,7 @@ def issue_add_milestone(request, project, issue, milestone): return redirect('show-issue', project.name, issue.id) + def issue_remove_milestone(request, project, issue, milestone): issue = get_object_or_404(Issue, project=project, id=issue) @@ -524,17 +545,19 @@ def issue_remove_milestone(request, project, issue, milestone): return redirect('show-issue', project.name, issue.id) + def label_list(request, project): labels = project.labels.filter(deleted=False) c = { - 'project': project, - 'labels': labels, - } + 'project': project, + 'labels': labels, + } return render(request, 'issue/label_list.html', c) + def label_edit(request, project, id=None): if id: @@ -569,18 +592,20 @@ def label_edit(request, project, id=None): issue = request.GET.get('issue') if issue: - return redirect('add-label-to-issue', project.name, issue, label.id) + return redirect('add-label-to-issue', project.name, + issue, label.id) return redirect('list-label', project.name) c = { - 'project': project, - 'form': form, - 'label': label, - } + 'project': project, + 'form': form, + 'label': label, + } return render(request, 'issue/label_edit.html', c) + def label_delete(request, project, id): label = get_object_or_404(Label, project=project, id=id) @@ -595,6 +620,7 @@ def label_delete(request, project, id): return redirect('list-label', project.name) + def milestone_list(request, project): show = request.GET.get('show', 'open') @@ -610,13 +636,14 @@ def milestone_list(request, project): milestones = None c = { - 'project': project, - 'milestones': milestones, - 'show': show, - } + 'project': project, + 'milestones': milestones, + 'show': show, + } return render(request, 'issue/milestone_list.html', c) + def milestone_edit(request, project, name=None): if name: @@ -636,7 +663,8 @@ def milestone_edit(request, project, name=None): if similar.exists(): - form._errors['name'] = ['There is already a milestone with this name.'] + form._errors['name'] = ['There is already a milestone ' + 'with this name.'] else: @@ -644,8 +672,11 @@ def milestone_edit(request, project, name=None): if name != form.cleaned_data['name']: author = User.objects.get(username=request.user.username) for issue in milestone.issues.all(): - event = Event(issue=issue, author=author, code=Event.CHANGE_MILESTONE, - args={'old_milestone': name, 'new_milestone': form.cleaned_data['name']}) + event = Event(issue=issue, author=author, + code=Event.CHANGE_MILESTONE, args={ + 'old_milestone': name, + 'new_milestone': form.cleaned_data['name'] + }) event.save() form.save() messages.success(request, 'Milestone modified successfully.') @@ -657,18 +688,20 @@ def milestone_edit(request, project, name=None): issue = request.GET.get('issue') if issue: - return redirect('add-milestone-to-issue', project.name, issue, milestone.name) + return redirect('add-milestone-to-issue', project.name, issue, + milestone.name) return redirect('list-milestone', project.name) c = { - 'project': project, - 'form': form, - 'milestone': milestone, - } + 'project': project, + 'form': form, + 'milestone': milestone, + } return render(request, 'issue/milestone_edit.html', c) + def milestone_close(request, project, name): milestone = get_object_or_404(Milestone, project=project, name=name) @@ -678,6 +711,7 @@ def milestone_close(request, project, name): return redirect('list-milestone', project.name) + def milestone_reopen(request, project, name): milestone = get_object_or_404(Milestone, project=project, name=name) @@ -687,6 +721,7 @@ def milestone_reopen(request, project, name): return redirect('list-milestone', project.name) + def milestone_delete(request, project, name): milestone = get_object_or_404(Milestone, project=project, name=name) diff --git a/ponytracker/settings.py b/ponytracker/settings.py index b0661b9..842333b 100644 --- a/ponytracker/settings.py +++ b/ponytracker/settings.py @@ -55,7 +55,9 @@ MIDDLEWARE_CLASSES = ( 'django.contrib.auth.middleware.AuthenticationMiddleware', ) if VERSION >= (1, 7): - MIDDLEWARE_CLASSES += ('django.contrib.auth.middleware.SessionAuthenticationMiddleware',) + MIDDLEWARE_CLASSES += ( + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + ) MIDDLEWARE_CLASSES += ( 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', @@ -98,7 +100,7 @@ STATIC_URL = '/static/' LOGIN_URL = '/login' -LOGIN_REDIRECT_URL='/' +LOGIN_REDIRECT_URL = '/' CRISPY_TEMPLATE_PACK = 'bootstrap3' diff --git a/ponytracker/urls.py b/ponytracker/urls.py index e62af7a..386c4eb 100644 --- a/ponytracker/urls.py +++ b/ponytracker/urls.py @@ -3,6 +3,6 @@ from django.contrib import admin urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), - url(r'^markdown/', include( 'django_markdown.urls')), + url(r'^markdown/', include('django_markdown.urls')), url(r'^', include('issue.urls')), ) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..e9ae6b4 --- /dev/null +++ b/tox.ini @@ -0,0 +1,3 @@ +[pep8] +exclude=env,issue/migrations,issue/urls.py +ignore=E128