-
Notifications
You must be signed in to change notification settings - Fork 106
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat(api): add passport_admin app * feat(api): add passport admin models and app * feat(api): passport admin model update * feat(api): passport admin endpoints * chore(api): unit tests for admin endpoints * chore(api): remove name from model * chore(api): fix test and squash migrations
- Loading branch information
schultztimothy
authored
Aug 3, 2023
1 parent
f116304
commit 42522c8
Showing
12 changed files
with
243 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
""" | ||
Module for administering Passport Admin. | ||
This includes registering the relevant models for PassportBanner and DismissedBanners. | ||
""" | ||
|
||
from django.contrib import admin | ||
|
||
from .models import DismissedBanners, PassportBanner | ||
|
||
admin.site.register(PassportBanner) | ||
admin.site.register(DismissedBanners) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
from typing import List | ||
|
||
from ceramic_cache.api import JWTDidAuth | ||
from django.db.models import Subquery | ||
from ninja import Router, Schema | ||
|
||
from .models import DismissedBanners, PassportBanner | ||
|
||
router = Router() | ||
|
||
|
||
def get_address(did: str): | ||
start = did.index("0x") | ||
return did[start:] | ||
|
||
|
||
class Banner(Schema): | ||
content: str | ||
link: str | ||
banner_id: int | ||
|
||
|
||
@router.get( | ||
"/banners", | ||
response=List[Banner], | ||
auth=JWTDidAuth(), | ||
) | ||
def get_banners(request): | ||
""" | ||
Get all banners | ||
""" | ||
try: | ||
address = get_address(request.auth.did) | ||
banners = ( | ||
PassportBanner.objects.filter(is_active=True) | ||
.exclude( | ||
pk__in=Subquery( | ||
DismissedBanners.objects.filter(address=address).values("banner_id") | ||
) | ||
) | ||
.all() | ||
) | ||
|
||
return [Banner(content=b.content, link=b.link, banner_id=b.pk) for b in banners] | ||
except: | ||
return { | ||
"status": "failed", | ||
} | ||
|
||
|
||
class GenericResponse(Schema): | ||
status: str | ||
|
||
|
||
@router.post( | ||
"/banners/{banner_id}/dismiss", | ||
response={200: GenericResponse}, | ||
auth=JWTDidAuth(), | ||
) | ||
def dismiss_banner(request, banner_id: int): | ||
""" | ||
Dismiss a banner | ||
""" | ||
try: | ||
banner = PassportBanner.objects.get(id=banner_id) | ||
address = get_address(request.auth.did) | ||
DismissedBanners.objects.create(address=address, banner=banner) | ||
return { | ||
"status": "success", | ||
} | ||
except PassportBanner.DoesNotExist: | ||
return { | ||
"status": "failed", | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
from django.apps import AppConfig | ||
|
||
|
||
class PassportAdminConfig(AppConfig): | ||
default_auto_field = "django.db.models.BigAutoField" | ||
name = "passport_admin" |
61 changes: 61 additions & 0 deletions
61
api/passport_admin/migrations/0001_squashed_0003_remove_passportbanner_name.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
# Generated by Django 4.2.3 on 2023-08-03 16:32 | ||
|
||
import django.db.models.deletion | ||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
replaces = [ | ||
("passport_admin", "0001_initial"), | ||
("passport_admin", "0002_rename_description_passportbanner_content_and_more"), | ||
("passport_admin", "0003_remove_passportbanner_name"), | ||
] | ||
|
||
initial = True | ||
|
||
dependencies = [] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name="PassportBanner", | ||
fields=[ | ||
( | ||
"id", | ||
models.BigAutoField( | ||
auto_created=True, | ||
primary_key=True, | ||
serialize=False, | ||
verbose_name="ID", | ||
), | ||
), | ||
("content", models.TextField()), | ||
("link", models.URLField(blank=True, null=True)), | ||
("is_active", models.BooleanField(default=True)), | ||
], | ||
), | ||
migrations.CreateModel( | ||
name="DismissedBanners", | ||
fields=[ | ||
( | ||
"id", | ||
models.BigAutoField( | ||
auto_created=True, | ||
primary_key=True, | ||
serialize=False, | ||
verbose_name="ID", | ||
), | ||
), | ||
("address", models.CharField(max_length=255)), | ||
( | ||
"banner", | ||
models.ForeignKey( | ||
default=None, | ||
on_delete=django.db.models.deletion.CASCADE, | ||
related_name="dismissedbanners", | ||
to="passport_admin.passportbanner", | ||
), | ||
), | ||
], | ||
), | ||
] |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
""" | ||
Module for defining models for Passport Admin. | ||
Includes models for PassportBanner and DismissedBanners. | ||
""" | ||
|
||
from django.db import models | ||
|
||
|
||
class PassportBanner(models.Model): | ||
""" | ||
Model representing a Passport Banner. | ||
""" | ||
|
||
content = models.TextField() | ||
link = models.URLField(blank=True, null=True) | ||
is_active = models.BooleanField(default=True) | ||
|
||
|
||
class DismissedBanners(models.Model): | ||
""" | ||
Model representing Dismissed Banners. | ||
""" | ||
|
||
address = models.CharField(max_length=255) | ||
banner = models.ForeignKey( | ||
PassportBanner, | ||
on_delete=models.CASCADE, | ||
default=None, | ||
related_name="dismissedbanners", | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from scorer.test.conftest import ( | ||
api_key, | ||
sample_address, | ||
sample_provider, | ||
sample_token, | ||
verifiable_credential, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
import pytest | ||
from django.test import Client | ||
from passport_admin.api import get_address | ||
from passport_admin.models import DismissedBanners, PassportBanner | ||
|
||
pytestmark = pytest.mark.django_db | ||
|
||
client = Client() | ||
|
||
|
||
class TestPassPortAdmin: | ||
def test_get_address(self): | ||
assert ( | ||
get_address("did:pkh:eip155:1:0xc79abb54e4824cdb65c71f2eeb2d7f2db5da1fb8") | ||
== "0xc79abb54e4824cdb65c71f2eeb2d7f2db5da1fb8" | ||
) | ||
|
||
def test_get_banners(self, sample_token): | ||
response = client.get( | ||
"/passport-admin/banners", | ||
HTTP_AUTHORIZATION=f"Bearer {sample_token}", | ||
content_type="application/json", | ||
) | ||
assert response.json() == [] | ||
|
||
def test_dismiss_banner(self, sample_token, sample_address): | ||
banner = PassportBanner.objects.create(content="test", link="test") | ||
response = client.post( | ||
f"/passport-admin/banners/{banner.pk}/dismiss", | ||
{}, | ||
content_type="application/json", | ||
HTTP_AUTHORIZATION=f"Bearer {sample_token}", | ||
) | ||
assert response.json() == {"status": "success"} | ||
dismissed_banner = DismissedBanners.objects.get( | ||
banner=banner, address=sample_address.lower() | ||
) | ||
assert dismissed_banner.banner == banner | ||
|
||
def test_dismiss_banner_does_not_exist(self, sample_token): | ||
response = client.post( | ||
"/passport-admin/banners/1/dismiss", | ||
{}, | ||
content_type="application/json", | ||
HTTP_AUTHORIZATION=f"Bearer {sample_token}", | ||
) # Needs JWT Auth | ||
assert response.json() == {"status": "failed"} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters