Skip to content

Commit

Permalink
Merge pull request #1030 from thunderstore-io/04-16-Add_cover_image_f…
Browse files Browse the repository at this point in the history
…or_Community

Add cover_image for Community
  • Loading branch information
MythicManiac authored Apr 17, 2024
2 parents 6e6a620 + 81fd55c commit b5ede04
Show file tree
Hide file tree
Showing 11 changed files with 98 additions and 0 deletions.
9 changes: 9 additions & 0 deletions django/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,15 @@ def dummy_image() -> Image:
return File(file_obj, name="test.png")


@pytest.fixture(scope="function")
def dummy_cover_image() -> Image:
file_obj = io.BytesIO()
image = Image.new("RGB", (1, 1), "#C0FFEE")
image.save(file_obj, format="PNG")
file_obj.seek(0)
return File(file_obj, name="test_cover.png")


@pytest.fixture(scope="function")
def manifest_v1_package_upload_id(
manifest_v1_package_bytes: bytes,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class CyberstormCommunitySerializer(serializers.Serializer):
discord_url = serializers.CharField(required=False)
datetime_created = serializers.DateTimeField()
background_image_url = serializers.CharField(required=False)
cover_image_url = serializers.CharField(required=False)
icon_url = serializers.CharField(required=False)
total_download_count = serializers.SerializerMethodField()
total_package_count = serializers.SerializerMethodField()
Expand Down
1 change: 1 addition & 0 deletions django/thunderstore/api/cyberstorm/tests/test_community.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def test_api_cyberstorm_community_detail_success(
assert c.aggregated.download_count == response_data["total_download_count"]
assert c.aggregated.package_count == response_data["total_package_count"]
assert c.background_image_url == response_data["background_image_url"]
assert c.cover_image_url == response_data["cover_image_url"]
assert c.description == response_data["description"]
assert c.discord_url == response_data["discord_url"]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ def test_api_cyberstorm_community_list_get_success(
client: APIClient,
community_site: CommunitySite,
dummy_image,
dummy_cover_image,
):
community1 = CommunityFactory(
aggregated_fields=CommunityAggregatedFields.objects.create(),
)
community2 = CommunityFactory(
aggregated_fields=CommunityAggregatedFields.objects.create(),
background_image=dummy_image,
cover_image=dummy_cover_image,
)

for _ in range(10):
Expand Down Expand Up @@ -65,6 +67,7 @@ def test_api_cyberstorm_community_list_get_success(
assert results[index]["total_download_count"] == c.aggregated.download_count
assert results[index]["total_package_count"] == c.aggregated.package_count
assert results[index]["background_image_url"] == c.background_image_url
assert results[index]["cover_image_url"] == c.cover_image_url
assert results[index]["description"] == c.description
assert results[index]["discord_url"] == c.discord_url

Expand Down
2 changes: 2 additions & 0 deletions django/thunderstore/community/admin/community.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class CommunityAdmin(admin.ModelAdmin):
"background_image_height",
"icon_width",
"icon_height",
"cover_image_width",
"cover_image_height",
"datetime_created",
"datetime_updated",
"aggregated_fields",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 3.1.7 on 2024-04-16 17:48

from django.db import migrations, models

import thunderstore.community.models.community


class Migration(migrations.Migration):

dependencies = [
("community", "0027_add_review_requested_field"),
]

operations = [
migrations.AddField(
model_name="community",
name="cover_image",
field=models.ImageField(
blank=True,
height_field="cover_image_height",
null=True,
upload_to=thunderstore.community.models.community.get_community_filepath,
width_field="cover_image_width",
),
),
migrations.AddField(
model_name="community",
name="cover_image_height",
field=models.PositiveIntegerField(default=0),
),
migrations.AddField(
model_name="community",
name="cover_image_width",
field=models.PositiveIntegerField(default=0),
),
]
28 changes: 28 additions & 0 deletions django/thunderstore/community/models/community.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ class Community(TimestampMixin, models.Model):
icon_width = models.PositiveIntegerField(default=0)
icon_height = models.PositiveIntegerField(default=0)

cover_image = models.ImageField(
upload_to=get_community_filepath,
width_field="cover_image_width",
height_field="cover_image_height",
blank=True,
null=True,
)
cover_image_width = models.PositiveIntegerField(default=0)
cover_image_height = models.PositiveIntegerField(default=0)

background_image = models.ImageField(
upload_to=get_community_filepath,
width_field="background_image_width",
Expand Down Expand Up @@ -118,6 +128,17 @@ def save(self, *args, **kwargs):
"background_image_height",
),
)
if not self.cover_image:
self.cover_image_width = 0
self.cover_image_height = 0
if "update_fields" in kwargs:
kwargs["update_fields"] = set(
kwargs["update_fields"]
+ (
"cover_image_width",
"cover_image_height",
),
)
return super().save(*args, **kwargs)

def __str__(self):
Expand All @@ -141,6 +162,13 @@ def background_image_url(self) -> Optional[str]:
"""
return None if not bool(self.background_image) else self.background_image.url

@cached_property
def cover_image_url(self) -> Optional[str]:
"""
Return URL to the community's cover image if one exists.
"""
return None if not bool(self.cover_image) else self.cover_image.url

@cached_property
def icon_url(self) -> Optional[str]:
"""
Expand Down
15 changes: 15 additions & 0 deletions django/thunderstore/community/tests/test_community.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,21 @@ def test_background_image_url_when_community_has_image(dummy_image):
assert len(url) > 0


@pytest.mark.django_db
def test_cover_image_url_when_community_has_no_image():
community = CommunityFactory()
url = community.cover_image_url
assert url is None


@pytest.mark.django_db
def test_cover_image_url_when_community_has_image(dummy_image):
community = CommunityFactory(cover_image=dummy_image)
url = community.cover_image_url
assert isinstance(url, str)
assert len(url) > 0


@pytest.mark.django_db
def test_icon_url_when_community_has_no_image():
community = CommunityFactory()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ def serialize_results(
return CommunityPackageListSerializer(
{
"bg_image_src": community.background_image_url,
"cover_image_src": community.cover_image_url,
"categories": [
PackageCategorySerializer(c).data
for c in community.package_categories.all()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def serialize_results(
communities = [
{
"bg_image_src": c.background_image_url,
"cover_image_src": c.cover_image_url,
"download_count": c.aggregated.download_count,
"identifier": c.identifier,
"name": c.name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ def serialize_results(
return PackageDetailViewContentSerializer(
{
"bg_image_src": listing.community.background_image_url,
"cover_image_src": listing.community.cover_image_url,
"categories": [
PackageCategorySerializer(c).data for c in listing.categories.all()
],
Expand Down

0 comments on commit b5ede04

Please sign in to comment.