FossilRepo

fossilrepo / projects / forms.py
Blame History Raw 84 lines
1
from django import forms
2
3
from organization.models import Team
4
5
from .models import Project, ProjectGroup, ProjectTeam
6
7
tw = "w-full rounded-md border-gray-300 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"
8
9
REPO_SOURCE_CHOICES = [
10
("empty", "Create empty repository"),
11
("fossil_url", "Clone from Fossil URL"),
12
]
13
14
15
class ProjectGroupForm(forms.ModelForm):
16
class Meta:
17
model = ProjectGroup
18
fields = ["name", "description"]
19
widgets = {
20
"name": forms.TextInput(attrs={"class": tw, "placeholder": "Group name"}),
21
"description": forms.Textarea(attrs={"class": tw, "rows": 3, "placeholder": "Description (optional)"}),
22
}
23
24
25
class ProjectForm(forms.ModelForm):
26
repo_source = forms.ChoiceField(
27
choices=REPO_SOURCE_CHOICES,
28
initial="empty",
29
widget=forms.RadioSelect,
30
required=False,
31
)
32
clone_url = forms.URLField(
33
required=False,
34
widget=forms.URLInput(attrs={"placeholder": "https://fossil-scm.org/home"}),
35
help_text="Fossil repository URL to clone from",
36
)
37
38
class Meta:
39
model = Project
40
fields = ["name", "description", "visibility", "group"]
41
widgets = {
42
"name": forms.TextInput(attrs={"class": tw, "placeholder": "Project name"}),
43
"description": forms.Textarea(attrs={"class": tw, "rows": 3, "placeholder": "Description"}),
44
"visibility": forms.Select(attrs={"class": tw}),
45
"group": forms.Select(attrs={"class": tw}),
46
}
47
48
def clean(self):
49
cleaned = super().clean()
50
repo_source = cleaned.get("repo_source", "empty")
51
clone_url = cleaned.get("clone_url", "").strip()
52
if repo_source == "fossil_url" and not clone_url:
53
self.add_error("clone_url", "Clone URL is required when cloning from a Fossil URL.")
54
return cleaned
55
56
57
class ProjectTeamAddForm(forms.Form):
58
team = forms.ModelChoiceField(
59
queryset=Team.objects.none(),
60
widget=forms.Select(attrs={"class": tw}),
61
label="Team",
62
)
63
role = forms.ChoiceField(
64
choices=ProjectTeam.Role.choices,
65
widget=forms.Select(attrs={"class": tw}),
66
label="Role",
67
)
68
69
def __init__(self, *args, project=None, **kwargs):
70
super().__init__(*args, **kwargs)
71
if project:
72
assigned_team_ids = project.project_teams.filter(deleted_at__isnull=True).values_list("team_id", flat=True)
73
self.fields["team"].queryset = Team.objects.filter(organization=project.organization, deleted_at__isnull=True).exclude(
74
id__in=assigned_team_ids
75
)
76
77
78
class ProjectTeamEditForm(forms.Form):
79
role = forms.ChoiceField(
80
choices=ProjectTeam.Role.choices,
81
widget=forms.Select(attrs={"class": tw}),
82
label="Role",
83
)
84

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button