Skip to content

Commit 2f3cd76

Browse files
committed
feat: GUI improved a lot thinking forward the blog
1 parent aeb34b9 commit 2f3cd76

28 files changed

Lines changed: 2267 additions & 101 deletions

api/src/etherbeing/apps/base/admin.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
Skill,
2929
User,
3030
)
31+
from .seed_data import initialize_site_content
3132

3233

3334
class EtherbeingAdminSite(admin.AdminSite):
@@ -115,6 +116,7 @@ def bootstrap_superuser(self, request: HttpRequest):
115116
return redirect("admin:login")
116117

117118
form.save()
119+
initialize_site_content()
118120
messages.success(request, "Superuser created successfully. You can log in now.")
119121
return redirect("admin:login")
120122

@@ -172,8 +174,8 @@ class AboutHighlightAdmin(admin.ModelAdmin):
172174

173175
@admin.register(Skill, site=admin_site)
174176
class SkillAdmin(admin.ModelAdmin):
175-
list_display = ("name", "image_key", "sort_order")
176-
search_fields = ("name", "image_key")
177+
list_display = ("name", "image_key", "image_url", "sort_order")
178+
search_fields = ("name", "image_key", "headline", "description")
177179

178180

179181
@admin.register(Service, site=admin_site)

api/src/etherbeing/apps/base/controllers.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,7 @@ def service(self, request: Request, slug: str):
367367

368368
service = Service.objects.filter(slug=slug).first()
369369
if service is None:
370-
site_content = SiteContent.objects.filter(slug="primary").first()
371-
if site_content is None:
372-
initialize_site_content()
370+
initialize_site_content()
373371
service = Service.objects.filter(slug=slug).first()
374372
if service is None:
375373
return Response({"detail": "Service not found."}, status=HTTPStatus.NOT_FOUND)

api/src/etherbeing/apps/base/migrations/0023_service_deliverables_service_engagement_cta_and_more.py

Lines changed: 194 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,165 @@
55
import django.db.models.deletion
66
from django.utils.text import slugify
77

8+
SERVICE_DETAIL_DEFAULTS = {
9+
"Frontend Web Development": {
10+
"slug": "frontend-web-development",
11+
"headline": "Design and build fast interfaces that feel intentional from the first pixel.",
12+
"overview": (
13+
"From landing pages to full product surfaces, I build responsive interfaces "
14+
"that are expressive, accessible, and ready to ship with real backend data."
15+
),
16+
"deliverables": [
17+
"Responsive UI implementation",
18+
"Reusable component architecture",
19+
"Backend API integration",
20+
"Performance and accessibility review",
21+
],
22+
"process_steps": [
23+
"Clarify goals, pages, and conversion paths",
24+
"Shape interface architecture and states",
25+
"Implement polished frontend with real data",
26+
"Review responsiveness, performance, and handoff",
27+
],
28+
"outcomes": [
29+
"Production-ready frontend",
30+
"Cleaner user journeys",
31+
"Consistent visual system",
32+
],
33+
"engagement_cta": "Share the product idea, audience, and pages you need most.",
34+
},
35+
"Backend API Development": {
36+
"slug": "backend-api-development",
37+
"headline": "Expose your data safely, clearly, and where the product actually needs it.",
38+
"overview": (
39+
"I design and implement backend services focused on maintainability, "
40+
"security, and clean integration with web, mobile, and internal tools."
41+
),
42+
"deliverables": [
43+
"REST or service API design",
44+
"Authentication and authorization flow",
45+
"Database modeling and migrations",
46+
"Operational documentation",
47+
],
48+
"process_steps": [
49+
"Map entities, permissions, and workflows",
50+
"Design data model and service boundaries",
51+
"Implement endpoints, validation, and tests",
52+
"Prepare deployment and integration guidance",
53+
],
54+
"outcomes": [
55+
"Stable backend foundation",
56+
"Safer data access patterns",
57+
"Faster product iteration",
58+
],
59+
"engagement_cta": "Describe the data flows, integrations, and constraints you need solved.",
60+
},
61+
"DevOps": {
62+
"slug": "devops",
63+
"headline": "Automate delivery, reduce friction, and keep infrastructure understandable.",
64+
"overview": (
65+
"I help teams ship faster with reliable environments, deployment automation, "
66+
"observability basics, and maintainable infrastructure decisions."
67+
),
68+
"deliverables": [
69+
"Containerized service setup",
70+
"Deployment workflow automation",
71+
"Environment and secret strategy",
72+
"Runtime and operational guidance",
73+
],
74+
"process_steps": [
75+
"Audit the current delivery flow",
76+
"Reduce manual steps and fragile config",
77+
"Automate build, release, and runtime pieces",
78+
"Document how the system is operated",
79+
],
80+
"outcomes": [
81+
"More reliable releases",
82+
"Less configuration drift",
83+
"Lower operational overhead",
84+
],
85+
"engagement_cta": "Tell me what is currently slowing deployments or hurting reliability.",
86+
},
87+
"Pentesting": {
88+
"slug": "pentesting",
89+
"headline": "Pressure-test your system before attackers or production users do.",
90+
"overview": (
91+
"I perform practical security reviews focused on exploitable issues, risky "
92+
"assumptions, and the fastest path to meaningful remediation."
93+
),
94+
"deliverables": [
95+
"Scoped security assessment",
96+
"Findings report with severity and impact",
97+
"Reproduction guidance",
98+
"Remediation recommendations",
99+
],
100+
"process_steps": [
101+
"Define scope and rules of engagement",
102+
"Enumerate attack surface and assumptions",
103+
"Validate findings and business impact",
104+
"Deliver report and remediation support",
105+
],
106+
"outcomes": [
107+
"Clearer risk visibility",
108+
"Actionable remediation worklist",
109+
"Higher confidence before release",
110+
],
111+
"engagement_cta": "Share the target scope, timeline, and any compliance or disclosure constraints.",
112+
},
113+
"Odoo and ERPs": {
114+
"slug": "odoo-and-erps",
115+
"headline": "Deploy business tooling that your team can actually use day to day.",
116+
"overview": (
117+
"I help businesses evaluate, deploy, and tailor ERP-style systems so operations, "
118+
"inventory, sales, and reporting become easier to manage."
119+
),
120+
"deliverables": [
121+
"ERP deployment and environment setup",
122+
"Core module configuration",
123+
"Integration planning",
124+
"Operational onboarding notes",
125+
],
126+
"process_steps": [
127+
"Understand the workflows the business needs covered",
128+
"Choose and prepare the deployment model",
129+
"Configure modules and baseline integrations",
130+
"Document usage and operational next steps",
131+
],
132+
"outcomes": [
133+
"Cleaner operations",
134+
"Better business visibility",
135+
"Reduced manual work",
136+
],
137+
"engagement_cta": "Tell me what processes you want the ERP to centralize or improve.",
138+
},
139+
"Android Development": {
140+
"slug": "android-development",
141+
"headline": "Ship mobile experiences that feel polished instead of merely portable.",
142+
"overview": (
143+
"I build Android and cross-platform mobile apps with a strong focus on product feel, "
144+
"runtime performance, and pragmatic architecture choices."
145+
),
146+
"deliverables": [
147+
"Mobile app implementation",
148+
"API integration and state flow",
149+
"Device-ready testing support",
150+
"Release preparation guidance",
151+
],
152+
"process_steps": [
153+
"Define the product flow and platform approach",
154+
"Implement the core experience and integrations",
155+
"Test critical states across devices",
156+
"Prepare release and iteration plan",
157+
],
158+
"outcomes": [
159+
"Faster mobile launch path",
160+
"More reliable app behavior",
161+
"Cleaner future iteration surface",
162+
],
163+
"engagement_cta": "Describe the app idea, target users, and whether you need native or cross-platform.",
164+
},
165+
}
166+
8167

9168
def populate_service_slugs(apps, schema_editor):
10169
Service = apps.get_model("base", "Service")
@@ -21,13 +180,46 @@ def populate_service_slugs(apps, schema_editor):
21180
used_slugs.add(slug)
22181

23182

183+
def populate_service_detail_fields(apps, schema_editor):
184+
Service = apps.get_model("base", "Service")
185+
for service in Service.objects.all():
186+
defaults = SERVICE_DETAIL_DEFAULTS.get(service.title)
187+
if not defaults:
188+
continue
189+
service.slug = defaults["slug"]
190+
service.headline = defaults["headline"]
191+
service.overview = defaults["overview"]
192+
service.deliverables = defaults["deliverables"]
193+
service.process_steps = defaults["process_steps"]
194+
service.outcomes = defaults["outcomes"]
195+
service.engagement_cta = defaults["engagement_cta"]
196+
service.save(
197+
update_fields=[
198+
"slug",
199+
"headline",
200+
"overview",
201+
"deliverables",
202+
"process_steps",
203+
"outcomes",
204+
"engagement_cta",
205+
]
206+
)
207+
208+
24209
class Migration(migrations.Migration):
25210

26211
dependencies = [
27212
('base', '0022_configuration'),
28213
]
29214

30215
operations = [
216+
migrations.RunSQL(
217+
sql=(
218+
"DROP INDEX IF EXISTS base_service_slug_e6de29de_like;"
219+
"DROP INDEX IF EXISTS base_service_slug_e6de29de;"
220+
),
221+
reverse_sql=migrations.RunSQL.noop,
222+
),
31223
migrations.AddField(
32224
model_name='service',
33225
name='deliverables',
@@ -61,13 +253,10 @@ class Migration(migrations.Migration):
61253
migrations.AddField(
62254
model_name='service',
63255
name='slug',
64-
field=models.SlugField(default='', max_length=255),
256+
field=models.SlugField(db_index=False, default='', max_length=255),
65257
),
66258
migrations.RunPython(populate_service_slugs, migrations.RunPython.noop),
67-
migrations.RunSQL(
68-
sql="DROP INDEX IF EXISTS base_service_slug_e6de29de_like;",
69-
reverse_sql=migrations.RunSQL.noop,
70-
),
259+
migrations.RunPython(populate_service_detail_fields, migrations.RunPython.noop),
71260
migrations.AlterField(
72261
model_name='service',
73262
name='slug',
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Generated by Django 4.2.28 on 2026-03-13 15:43
2+
3+
from django.db import migrations, models
4+
5+
SKILL_DEFAULTS = {
6+
"Cybersecurity": {
7+
"image_url": "/skills/kali.png",
8+
"headline": "Offensive validation and defensive hardening",
9+
"description": "Practical security work spanning pentesting, audit, enumeration, and remediation support.",
10+
},
11+
"Rust": {
12+
"image_url": "/skills/rust.png",
13+
"headline": "Systems work with reliability in mind",
14+
"description": "High-confidence backend and systems development with an emphasis on correctness and performance.",
15+
},
16+
"Pentesting": {
17+
"image_url": "/skills/metasploit.png",
18+
"headline": "Exploit thinking for real-world release readiness",
19+
"description": "Attack-surface review and exploit-driven testing to expose meaningful security weaknesses before launch.",
20+
},
21+
"Biological Neural Nets": {
22+
"image_url": "/skills/tensorflow.png",
23+
"headline": "Research-oriented intelligence systems",
24+
"description": "Applied AI exploration informed by research, experimentation, and practical implementation constraints.",
25+
},
26+
"Python": {
27+
"image_url": "/skills/python.svg",
28+
"headline": "Fast iteration for APIs, tooling, and automation",
29+
"description": "Backend services, scripting, and automation pipelines that reduce friction and move quickly.",
30+
},
31+
"React TS": {
32+
"image_url": "/skills/react.svg",
33+
"headline": "Polished interactive product surfaces",
34+
"description": "Frontend systems with intentional UI structure, live data integration, and maintainable component design.",
35+
},
36+
}
37+
38+
39+
def populate_skill_card_fields(apps, schema_editor):
40+
Skill = apps.get_model("base", "Skill")
41+
for skill in Skill.objects.all():
42+
defaults = SKILL_DEFAULTS.get(skill.name)
43+
if not defaults:
44+
continue
45+
skill.image_url = defaults["image_url"]
46+
skill.headline = defaults["headline"]
47+
skill.description = defaults["description"]
48+
skill.save(update_fields=["image_url", "headline", "description"])
49+
50+
51+
class Migration(migrations.Migration):
52+
53+
dependencies = [
54+
('base', '0023_service_deliverables_service_engagement_cta_and_more'),
55+
]
56+
57+
operations = [
58+
migrations.AddField(
59+
model_name='skill',
60+
name='description',
61+
field=models.TextField(blank=True, default=''),
62+
),
63+
migrations.AddField(
64+
model_name='skill',
65+
name='headline',
66+
field=models.CharField(blank=True, default='', max_length=255),
67+
),
68+
migrations.AddField(
69+
model_name='skill',
70+
name='image_url',
71+
field=models.CharField(blank=True, default='', max_length=500),
72+
),
73+
migrations.RunPython(populate_skill_card_fields, migrations.RunPython.noop),
74+
]

0 commit comments

Comments
 (0)