1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
import logging
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from django.contrib.auth.models import Group, Permission, User
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from django.core.management.base import BaseCommand
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from organization.models import Organization, OrganizationMember, OrgRole, Team
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from pages.models import Page
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from projects.models import Project, ProjectTeam
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
logger = logging.getLogger(__name__)
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class Command(BaseCommand):
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
help = "Seed the database with initial data for development."
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def add_arguments(self, parser):
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
parser.add_argument("--flush", action="store_true", help="Flush non-system tables before seeding.")
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def handle(self, *args, **options):
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if options["flush"]:
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self.stdout.write("Flushing data...")
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Page.all_objects.all().delete()
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.all_objects.all().delete()
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Project.all_objects.all().delete()
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Team.all_objects.all().delete()
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
OrganizationMember.all_objects.all().delete()
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Organization.all_objects.all().delete()
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Groups and permissions
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
admin_group, _ = Group.objects.get_or_create(name="Administrators")
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
viewer_group, _ = Group.objects.get_or_create(name="Viewers")
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Admin group gets all permissions for org, projects, and pages
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for app_label in ["organization", "projects", "pages"]:
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
perms = Permission.objects.filter(content_type__app_label=app_label)
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
admin_group.permissions.add(*perms)
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Viewer group gets view permissions for org, projects, and pages
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
view_perms = Permission.objects.filter(
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
content_type__app_label__in=["organization", "projects", "pages"],
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
codename__startswith="view_",
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
viewer_group.permissions.set(view_perms)
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Superuser
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
admin_user, created = User.objects.get_or_create(
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
username="admin",
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
defaults={"email": "[email protected] ", "is_staff": True, "is_superuser": True},
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if created:
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
admin_user.set_password("admin")
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
admin_user.save()
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self.stdout.write(self.style.SUCCESS("Created superuser: admin / admin"))
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Regular user
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
viewer_user, created = User.objects.get_or_create(
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
username="viewer",
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
defaults={"email": "[email protected] ", "is_staff": False, "is_superuser": False},
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if created:
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
viewer_user.set_password("viewer")
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
viewer_user.save()
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
viewer_user.groups.add(viewer_group)
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self.stdout.write(self.style.SUCCESS("Created viewer user: viewer / viewer"))
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Organization
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
org, _ = Organization.objects.get_or_create(name="Fossilrepo HQ", defaults={"description": "Default organization"})
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
OrganizationMember.objects.get_or_create(member=admin_user, organization=org)
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
OrganizationMember.objects.get_or_create(member=viewer_user, organization=org)
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Teams
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
core_devs, _ = Team.objects.get_or_create(name="Core Devs", defaults={"organization": org, "description": "Core development team"})
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
core_devs.members.add(admin_user)
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
contributors, _ = Team.objects.get_or_create(
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name="Contributors", defaults={"organization": org, "description": "Community contributors"}
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
contributors.members.add(viewer_user)
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
reviewers, _ = Team.objects.get_or_create(name="Reviewers", defaults={"organization": org, "description": "Code review team"})
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
reviewers.members.add(admin_user, viewer_user)
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Projects
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
projects_data = [
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"name": "Frontend App", "description": "User-facing web application", "visibility": "internal"},
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"name": "Backend API", "description": "Core API service", "visibility": "private"},
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"name": "Documentation", "description": "Project documentation and guides", "visibility": "public"},
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{"name": "Infrastructure", "description": "Deployment and infrastructure tooling", "visibility": "private"},
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
]
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for pdata in projects_data:
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
project, _ = Project.objects.get_or_create(
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name=pdata["name"],
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
defaults={**pdata, "organization": org, "created_by": admin_user},
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Team-project assignments
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
frontend = Project.objects.filter(name="Frontend App").first()
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
backend = Project.objects.filter(name="Backend API").first()
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
docs = Project.objects.filter(name="Documentation").first()
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if frontend:
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.objects.get_or_create(project=frontend, team=core_devs, defaults={"role": "admin"})
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.objects.get_or_create(project=frontend, team=contributors, defaults={"role": "write"})
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if backend:
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.objects.get_or_create(project=backend, team=core_devs, defaults={"role": "admin"})
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.objects.get_or_create(project=backend, team=reviewers, defaults={"role": "read"})
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if docs:
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.objects.get_or_create(project=docs, team=contributors, defaults={"role": "write"})
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ProjectTeam.objects.get_or_create(project=docs, team=reviewers, defaults={"role": "write"})
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Sample docs pages
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
pages_data = [
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"name": "Getting Started",
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"content": "# Getting Started\n\nWelcome to Fossilrepo. This guide covers initial setup and configuration.\n\n## Prerequisites\n\n- Docker and Docker Compose\n- A domain name (for SSL)\n- S3-compatible storage (for backups)\n\n## Quick Start\n\n1. Clone the repository\n2. Copy `.env.example` to `.env`\n3. Run `fossilrepo-ctl reconfigure`\n4. Run `fossilrepo-ctl start`\n",
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
},
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"name": "Admin Guide",
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"content": "# Admin Guide\n\nThis guide covers day-to-day administration of your Fossilrepo instance.\n\n## Managing Users\n\nUsers can be added through the Django admin or the Settings > Members page.\n\n## Backups\n\nLitestream continuously replicates all `.fossil` files to S3. Manual backups can be created with `fossilrepo-ctl backup create`.\n\n## Monitoring\n\nCheck `/health/` for service status and `/status/` for an overview page.\n",
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
},
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"name": "Architecture Overview",
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"content": "# Architecture Overview\n\n## Stack\n\n| Component | Technology |\n|-----------|------------|\n| Backend | Django 5 + HTMX |\n| Database | PostgreSQL 16 |\n| SCM | Fossil |\n| Proxy | Caddy |\n| Backups | Litestream → S3 |\n| Jobs | Celery + Redis |\n\n## How It Works\n\nEach Fossil repository is a single `.fossil` SQLite file. Caddy routes subdomain requests to the Fossil server. Django provides the management UI. Litestream continuously replicates repo files to S3.\n",
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
},
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
]
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for pdata in pages_data:
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Page.objects.get_or_create(
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name=pdata["name"],
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
defaults={**pdata, "organization": org, "created_by": admin_user},
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- Seed sample users per role ---
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
roles = OrgRole.objects.all()
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if not roles.exists():
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from django.core.management import call_command
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
call_command("seed_roles")
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
roles = OrgRole.objects.all()
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
role_users = {
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"admin": {"email": "[email protected] ", "first_name": "Admin", "last_name": "User"},
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"manager": {"email": "[email protected] ", "first_name": "Manager", "last_name": "User"},
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"developer": {"email": "[email protected] ", "first_name": "Dev", "last_name": "User"},
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"viewer": {"email": "[email protected] ", "first_name": "Viewer", "last_name": "RoleUser"},
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for role in roles:
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
slug = role.slug
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if slug not in role_users:
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
continue
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
info = role_users[slug]
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
username = f"role-{slug}"
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
user, created = User.objects.get_or_create(
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
username=username,
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
defaults={
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"email": info["email"],
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"first_name": info["first_name"],
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"last_name": info["last_name"],
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"is_active": True,
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
},
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if created:
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
user.set_password(username)
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
user.save()
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
membership, _ = OrganizationMember.objects.get_or_create(
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
member=user,
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
organization=org,
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
defaults={"created_by": admin_user},
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
)
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if membership.role != role:
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
membership.role = role
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
membership.save()
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
role.apply_to_user(user)
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self.stdout.write(f" User: {username} / {username} (role: {role.name})")
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self.stdout.write(self.style.SUCCESS("Seed complete."))
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!