Skip to content

Commit

Permalink
Merge pull request #3 from PROCOLLAB-github/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
yeezy-na-izi authored Nov 1, 2022
2 parents fe2735c + 3cd0024 commit 98c958c
Show file tree
Hide file tree
Showing 30 changed files with 535 additions and 51 deletions.
10 changes: 6 additions & 4 deletions .github/workflows/release-ci.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

name: 'Build and Deploy server'

on:
Expand Down Expand Up @@ -87,15 +88,15 @@ jobs:
cache-to: type=gha,mode=max
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

- name: run on server
uses: garygrossgarten/github-action-ssh@release
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
password: ${{ secrets.SERVER_PASSWORD }}
command: |
cd /home/app/procollab-backend &&
cd /home/app/procollab-backend
docker-compose -f docker-compose.prod-ci.yml -p prod pull
rm -f .env &&
Expand All @@ -114,6 +115,7 @@ jobs:
echo "EMAIL_HOST=${{ secrets.EMAIL_HOST }}" >> .env &&
echo "EMAIL_PORT=${{ secrets.EMAIL_PORT }}" >> .env &&
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env &&
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env
docker-compose -f docker-compose.prod-ci.yml -p prod up -d
docker-compose -f docker-compose.prod-ci.yml -p prod up -d
19 changes: 19 additions & 0 deletions industries/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from rest_framework.permissions import BasePermission

from core.constants import SAFE_METHODS


class IndustryPermission(BasePermission):
"""
Allows access to update only to staff users.
"""

def has_permission(self, request, view) -> bool:
if request.method in SAFE_METHODS or request.user and request.user.is_staff:
return True
return False

def has_object_permission(self, request, view, obj) -> bool:
if request.method in SAFE_METHODS or request.user and request.user.is_staff:
return True
return False
1 change: 1 addition & 0 deletions industries/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,5 +103,6 @@ def _user_create(self):
user_id = response.data["id"]
user = CustomUser.objects.get(id=user_id)
user.is_active = True
user.is_staff = True
user.save()
return user
7 changes: 3 additions & 4 deletions industries/views.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
from rest_framework import generics

from core.permissions import IsStaffOrReadOnly
from industries.models import Industry
from industries.serializers import IndustrySerializer


class IndustryList(generics.ListCreateAPIView):
queryset = Industry.objects.all()
serializer_class = IndustrySerializer
# TODO check permissions using JWT
# permission_classes = [permissions.IsAuthenticatedOrReadOnly]
permission_classes = [IsStaffOrReadOnly]


class IndustryDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Industry.objects.all()
serializer_class = IndustrySerializer
# TODO check permissions using JWT
# permission_classes = [permissions.IsAuthenticatedOrReadOnly]
permission_classes = [IsStaffOrReadOnly]
Empty file added metrics/__init__.py
Empty file.
Empty file added metrics/admin.py
Empty file.
7 changes: 7 additions & 0 deletions metrics/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.apps import AppConfig


class MetricsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "metrics"
verbose_name = "Метрики"
Empty file added metrics/migrations/__init__.py
Empty file.
Empty file added metrics/tests.py
Empty file.
10 changes: 10 additions & 0 deletions metrics/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.urls import path


from metrics.views import MetricsView

app_name = "metrics"

urlpatterns = [
path("", MetricsView.as_view()),
]
51 changes: 51 additions & 0 deletions metrics/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from django.contrib.auth import get_user_model
from projects.models import Project
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from users.models import Expert, Investor, Member, Mentor
from vacancy.models import Vacancy

User = get_user_model()


class MetricsView(APIView):
"""
Metrics view
Shows metrics from the database.
"""

permission_classes = [permissions.IsAdminUser]

def get(self, request, format=None):
data = {}

models = [User, Expert, Investor, Member, Mentor, Project, Vacancy]

for model in models:
data = self._update_total_counts(data, model)

return Response(data)

def _update_total_counts(self, data, model) -> dict[str, int]:
"""
Updates the total counts of the given model.
Args:
data: dict with data.
model: model to get count from.
Returns:
dict: A dictionary with the updated data.
For example:
{
"total_Investor_count": 3,
}
"""

new_data = dict(data)
new_data[f"total_{model.__name__}_count"] = model.objects.count()

return new_data
14 changes: 13 additions & 1 deletion news/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from news.models import News, NewsTag


class NewsSerializer(serializers.ModelSerializer):
class NewsDetailSerializer(serializers.ModelSerializer):
class Meta:
model = News
fields = [
Expand All @@ -18,6 +18,18 @@ class Meta:
]


class NewsListSerializer(serializers.ModelSerializer):
class Meta:
model = News
fields = [
"id",
"title",
"short_text",
"cover_url",
"datetime_created",
]


class NewsTagSerializer(serializers.ModelSerializer):
class Meta:
model = NewsTag
Expand Down
1 change: 0 additions & 1 deletion news/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ def test_news_creation(self):

self.assertEqual(response.status_code, 201)
self.assertEqual(response.data["title"], self.TITLE)
self.assertEqual(response.data["text"], self.TEXT)
self.assertEqual(response.data["short_text"], self.SHORT_TEXT)
self.assertEqual(response.data["cover_url"], self.COVER_URL)

Expand Down
6 changes: 3 additions & 3 deletions news/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
from core.permissions import IsStaffOrReadOnly
from news.filters import NewsFilter
from news.models import News, NewsTag
from news.serializers import NewsSerializer, NewsTagSerializer
from news.serializers import NewsDetailSerializer, NewsListSerializer, NewsTagSerializer


class NewsList(generics.ListCreateAPIView):
queryset = News.objects.all()
serializer_class = NewsSerializer
serializer_class = NewsListSerializer
permission_classes = [IsStaffOrReadOnly]
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = NewsFilter


class NewsDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = News.objects.all()
serializer_class = NewsSerializer
serializer_class = NewsDetailSerializer
permission_classes = [IsStaffOrReadOnly]


Expand Down
2 changes: 2 additions & 0 deletions procollab/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
"projects.apps.ProjectsConfig",
"news.apps.NewsConfig",
"vacancy.apps.VacancyConfig",
"metrics.apps.MetricsConfig",
# Rest framework
"rest_framework",
"rest_framework_simplejwt",
Expand Down Expand Up @@ -119,6 +120,7 @@
"rest_framework.renderers.AdminRenderer",
],
}

# Database
if DEBUG:
DATABASES = {
Expand Down
1 change: 1 addition & 0 deletions procollab/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
path("api/token/verify/", TokenVerifyView.as_view(), name="token_verify"),
path("", include("metrics.urls", namespace="metrics")),
]

if settings.DEBUG:
Expand Down
7 changes: 6 additions & 1 deletion projects/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.contrib import admin

from projects.models import Project
from projects.models import Project, Achievement


@admin.register(Project)
Expand All @@ -13,3 +13,8 @@ class ProjectAdmin(admin.ModelAdmin):
"id",
"name",
)


@admin.register(Achievement)
class AchievementAdmin(admin.ModelAdmin):
list_display = ("id", "title", "status", "project")
61 changes: 61 additions & 0 deletions projects/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
from django.db.models import Manager
from django.db.models import Prefetch

from industries.models import Industry
from users.models import CustomUser


class ProjectManager(Manager):
def get_projects_for_list_view(self):
return (
self.get_queryset()
.prefetch_related(
Prefetch(
"industry",
queryset=Industry.objects.only("name").all(),
),
Prefetch(
"leader",
queryset=CustomUser.objects.only("id").all(),
),
)
.only(
"id",
"name",
"leader__id",
"description",
"short_description",
"step",
"industry__name",
"image_address",
"draft",
"datetime_created",
)
.all()
)

def get_projects_for_detail_view(self):
return (
self.get_queryset()
.prefetch_related(
"collaborators",
"achievements",
)
.all()
)


class AchievementManager(Manager):
def get_achievements_for_list_view(self):
return (
self.get_queryset()
.select_related("project")
.only("id", "title", "status", "project__id")
)

def get_achievements_for_detail_view(self):
return (
self.get_queryset()
.select_related("project")
.only("id", "title", "status", "project")
)
7 changes: 6 additions & 1 deletion projects/models.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.contrib.auth import get_user_model
from django.db import models
from industries.models import Industry

from industries.models import Industry
from projects.helpers import VERBOSE_STEPS
from projects.managers import ProjectManager, AchievementManager

User = get_user_model()

Expand Down Expand Up @@ -66,6 +67,8 @@ class Project(models.Model):
verbose_name="Дата изменения", null=False, auto_now=True
)

objects = ProjectManager()

def __str__(self):
return f"Project<{self.id}> - {self.name}"

Expand Down Expand Up @@ -94,6 +97,8 @@ class Achievement(models.Model):
related_name="achievements",
)

objects = AchievementManager()

def __str__(self):
return f"Achievement<{self.id}>"

Expand Down
Loading

0 comments on commit 98c958c

Please sign in to comment.