Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ frontend/.env
# vim
*.swp
*.*~
/*~

# OS files
.DS_Store
Expand Down
Empty file added .idea/.gitignore
Empty file.
14 changes: 14 additions & 0 deletions .idea/arch-vim.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

156 changes: 156 additions & 0 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

79 changes: 78 additions & 1 deletion backend/api/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,80 @@
from django.contrib import admin
from django.utils.html import mark_safe
from .models import UserProfile, UserProgress, Level, User_Level, UserLevelInstance

# Register your models here.

class UserProgressInline(admin.StackedInline):
model = UserProgress
extra = 0


class UserProfileInline(admin.StackedInline):
model = UserProfile
extra = 0


@admin.register(Level)
class LevelAdmin(admin.ModelAdmin):
list_display = ('level', 'level_name', 'get_color_preview', 'get_icon_preview', 'is_active')
list_editable = ('is_active',)
search_fields = ('level_name',)
list_filter = ('is_active',)
readonly_fields = ('get_icon_preview',)

def get_icon_preview(self, obj):
if obj.icon:
return mark_safe('<img src="{}" style="width: 30px; height: 30px; border-radius: 5px;" />', obj.icon.url)
return "No Icon"

get_icon_preview.short_description = "Icon Preview"

def get_color_preview(self, obj):
hex_color = obj.color_wheel or "#ffffff"
gradient = f"linear-gradient(to right, {obj.color})" if obj.color else hex_color

return mark_safe(
'<div style="width: 50px; height: 20px; border: 1px solid #000; background: {}; border-radius: 3px;"></div>',
gradient
)

get_color_preview.short_description = "Color/Gradient"


@admin.register(User_Level)
class UserLevelAdmin(admin.ModelAdmin):
list_display = ('level', 'min_accuracy', 'max_keystrokes', 'stars', 'is_active')
list_filter = ('level', 'is_active')


@admin.register(UserLevelInstance)
class UserLevelInstanceAdmin(admin.ModelAdmin):
list_display = ('user', 'level', 'stars_earned', 'accuracy', 'max_time', 'completed', 'attempted_at')
list_filter = ('completed', 'stars_earned', 'level')
search_fields = ('user__username', 'level__level_name')
readonly_fields = ('attempted_at',)

def stars_earned_display(self, obj):
return mark_safe(
'<span style="color: orange; font-weight: bold;">{}</span>',
"★" * obj.stars_earned + "☆" * (3 - obj.stars_earned)
)

stars_earned_display.short_description = "Stars"

list_display = ('user', 'level', 'stars_earned_display', 'accuracy', 'completed', 'attempted_at')


@admin.register(UserProgress)
class UserProgressAdmin(admin.ModelAdmin):
list_display = ('user', 'get_data_summary')

def get_data_summary(self, obj):
return str(obj.data)[:50] + "..." if obj.data else "{}"

get_data_summary.short_description = "Data Preview"


@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user',)
inlines = [UserProgressInline]
32 changes: 32 additions & 0 deletions backend/api/factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@

import factory
from django.contrib.auth.models import User
from .models import Level, User_Level, UserLevelInstance, UserProfile


class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User

username = factory.Sequence(lambda n: f"user{n}")
password = factory.PostGenerationMethodCall('set_password', 'password123')


class LevelFactory(factory.django.DjangoModelFactory):
class Meta:
model = Level

level = factory.Sequence(lambda n: n)
level_name = factory.Sequence(lambda n: f"Level {n}")
display_name = factory.LazyAttribute(lambda o: o.level_name)


class UserLevelConfigFactory(factory.django.DjangoModelFactory):
class Meta:
model = User_Level

level = factory.SubFactory(LevelFactory)
min_accuracy = 80.0
max_keystrokes = 150
stars = 1 # not really used in your logic
is_active = 1
Loading