diff --git a/README.md b/README.md deleted file mode 100644 index 71aae008..00000000 --- a/README.md +++ /dev/null @@ -1,256 +0,0 @@ -

- -![Versões do Django](./doc/img/sige_ie_logo.jpeg) - -SIGE IE -

- -### Fase do projeto -Release 1 Ir para milestone da release 1 - -### Sobre este projeto -Aplicativo web mobile desenvolvido para a Universidade de Brasília com objetivo de gerenciar as instalações elétricas e dar suporte ao retrofitting das instalações. -#### Posição -O SIGE IE é um sistema da Universidade de Brasília para o gerenciamento de instalações elétricas com o objetivo de facilitar o cadastro das informações de instalação elétrica para ajudar na reforma da parte elétrica dos prédios e salas. Ele permite a automatização da geração de relatórios das instalações elétricas de cada lugar e a centralização dessas informações para uso dos responsáveis pelas instalações. As pessoas devem usar o SIGE IE porque ele simplifica e agiliza o processo de gerenciamento, principalmente do retrofitting de instalações elétricas, garantindo maior eficiência e segurança. - -#### Objetivos -Simplificar o cadastro e gerenciamento de informações de instalações elétricas e automatizar a geração de relatórios. -#### Tecnologias -##### Back-end - -
- -| Nome | Versão | Uso | Configuração | -|---|---|---|---| -| Python | 3.11.8| Linguagem | [Site oficial do Python](https://www.python.org/downloads/) Ou veja na seção "Como subir o back-end" | -| Django | 4.2 (LTS) | Framework web | Automática | -| Django REST framework | 3.14 | API REST | Automática | -| Docker | 25.0.4 | Conteiner e imagem | [Site oficial do Docker](https://docs.docker.com/desktop/install/ubuntu/) | -| Redis | 7.2 | Banco de dados cache para sessão | Automática via Docker | -| MySQL | 8.1 | Banco de dados | Automática via Docker | -| mysqlclient | 2.2.4 | Cliente para se conectar com MySQL | [Site do Pypi com as configurações](https://pypi.org/project/mysqlclient/) Ou veja na seção "Como subir o back-end" - -
- -###### Observação -Atualmente o Django REST Framework suporta as seguintes versões do Python e do Django: - -
- -| Python | 3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | -|--------|-----|-----|-----|-----|------|------| -| Django | 3.0 | 3.1 | 3.2 | 4.0 | 4.1 | 4.2 (LTS) | - -
- -Como a versão LTS mais recente do Django (2024) é a 4.2, escolhemos configurar o projeto usando Python 3.11. - -##### Front-end mobile - -
- -| Nome | Versão | Uso | Configuração | -|---|---|---|---| -| Flutter | 3.19.3 | Framework frontend | [Site oficial do Flutter](https://docs.flutter.dev/get-started/install/linux) | -| Android Studio | Iguana | IDE para desenvolvimento Android com Android SDK | [Site oficial do Android Studio](https://developer.android.com/studio/index.html) | - -
- -### Contribuidores -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AlefMemTavPedro LucasContribuidor
EngDannDaniloContribuidor
kauan2872KauanContribuidor
OscarDeBritoOscarContribuidor
ramires31RamiresContribuidor
-
- -### Como subir o projeto -Estas etapas são válidas para Linux OS e WSL. -#### Como subir o back-end: - -Primeiramente, interrompa qualquer processo que use o porto 8080, 3306 e 6379. Então atualize o seu sistema: - ``` - sudo apt-get update - ``` - - ``` - sudo apt-get upgrade - ``` - -Em seguida, caso já não tenha instalado: - -- Instale o Python, Pip e os cabeçalhos do Python e MySQL: - - Python: - ``` - sudo apt-get install python3.11 - ``` - - Pip: - ``` - sudo apt-get install python3-pip - ``` - - Cabeçalhos: - ``` - sudo apt-get install python3.11-dev default-libmysqlclient-dev build-essential pkg-config - ``` - - mysqlclient: - - ``` - pip install mysqlclient - ``` - -- Instale o virtualenv para criar um ambiente virtual do projeto: - - Virtualenv: - ``` - sudo pip3 install virtualenv - ``` - -Vá para dentro da pasta raiz `api`: - -1. Cria o ambiente virtual e ative-o: - - Criar ambiente virtual: - ``` - virtualenv -p python3.11 venv - ``` - - Ativar ambiente: - ``` - source venv/bin/activate - ``` - -3. Com o ambiente virtual ativado, instale as dependências: - - ``` - pip install -r requirements.txt - ``` - -4. Com o docker iniciado, crie a imagem do banco de dados pela primeira vez: - - ``` - docker-compose build - ``` - -6. Suba a imagem: - - ``` - docker-compose up - ``` - -8. Ainda no diretório raiz `api`, aplique as migrações: - - ``` - python manage.py makemigrations - ``` - - ``` - python3 manage.py migrate - ``` - -10. Inicie o servidor: - - ``` - python3 manage.py runserver - ``` - -Pronto, o servidor já está rodando com o banco de dados configurado. -#### Como Subir o Front-end: - -Antes de começar, verifique se o Flutter SDK está atualizado e compatível com o projeto. Siga as instruções específicas para sua plataforma (Windows, macOS, Linux) disponíveis na [documentação oficial do Flutter](https://flutter.dev/docs/get-started/install). - -Caso ainda não tenha feito, instale os seguintes requisitos em sua máquina: - -- **Flutter SDK**: - Siga as instruções de instalação para a sua plataforma. - -- **Android Studio ou Visual Studio Code**: - - - Android Studio: - ``` - sudo snap install android-studio --classic - ``` - - - Visual Studio Code: - ``` - sudo snap install code --classic - ``` - Para o VS Code, instale as extensões do Flutter e Dart disponíveis na aba de extensões do editor. - -- **Emulador Android ou um dispositivo físico**: - Configure um emulador usando o AVD Manager do Android Studio ou [configure seu dispositivo Android para depuração USB](https://developer.android.com/studio/debug/dev-options). - -Com o ambiente preparado, siga os passos abaixo: - -1. **Clone o Repositório do Front-end**: - ``` - git clone https://github.com/ResidenciaTICBrisa/T2G3-Sistema-Instalacao-Eletrica.git - ``` - -2. **Abra o Projeto no Editor**: - Abra a pasta clonada no Android Studio ou no Visual Studio Code. - -3. **Baixe as Dependências**: - Abra um terminal no editor e execute o comando: - ``` - flutter pub get - ``` - -4. **Execute o Projeto**: - - **No Android Studio:** Escolha um dispositivo ou emulador na barra de ferramentas e clique em 'Run'. - - **No Visual Studio Code:** Selecione um dispositivo ou emulador na barra de status e pressione `F5` ou utilize o comando `Flutter: Run` na paleta de comandos. - -Pronto, o Front end já está rodando e você pode utilizá-lo. - - -### Como contribuir -1. Faça um fork do repositório do projeto. -2. Clone o fork na sua máquina: - - ``` - git clone https://github.com/{seu-usuario}/T2G3-Sistema-Instalacao-Eletrica.git - ``` - -4. Comente na issue que deseja contribuir ou crie uma issue nova. -5. Entre no repositório clonado na sua máquina: - - ``` - cd T2G3-Sistema-Instalacao-Eletrica - ``` - -7. Após enviar suas contribuições para o fork do seu repositório, faça um pull request. -8. Aguarde a revisão. - -### Documentação -- [Cronograma](https://github.com/ResidenciaTICBrisa/T2G3-Sistema-Instalacao-Eletrica/issues/3) -- [Requisitos](https://github.com/ResidenciaTICBrisa/T2G3-Sistema-Instalacao-Eletrica/issues/1) -- [Arquitetura](https://github.com/ResidenciaTICBrisa/T2G3-Sistema-Instalacao-Eletrica/issues/2) -- [Atas de reunião](https://github.com/ResidenciaTICBrisa/T2G3-Sistema-Instalacao-Eletrica/issues/4) diff --git a/api/places/models.py b/api/places/models.py deleted file mode 100644 index 901f0268..00000000 --- a/api/places/models.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.db import models -from django.core.validators import MinValueValidator -from django.contrib.auth.models import User - -class Place(models.Model): - - name = models.CharField(max_length=50) - user = models.ForeignKey(User, verbose_name=("creator"), on_delete=models.CASCADE) - - def __str__(self): - return self.name - -class Room(models.Model): - - name = models.CharField(max_length=50) - floor = models.IntegerField(default=0, validators=[MinValueValidator(0)]) - place = models.ForeignKey(Place, related_name='rooms', on_delete=models.CASCADE) - systems = models.ManyToManyField('systems.System') - - - - diff --git a/api/places/serializers.py b/api/places/serializers.py deleted file mode 100644 index 39ef39d0..00000000 --- a/api/places/serializers.py +++ /dev/null @@ -1,17 +0,0 @@ -from rest_framework import serializers -from .models import Place, Room - -class PlaceSerializer(serializers.ModelSerializer): - class Meta: - model = Place - fields = ['name', 'user'] - -class RoomSerializer(serializers.ModelSerializer): - class Meta: - model = Room - fields = ['id', 'name', 'floor', 'systems', 'place'] - extra_kwargs = { - 'name': {'required': True}, - 'floor': {'required': True}, - 'place_id': {'read_only': True} - } \ No newline at end of file diff --git a/api/places/views.py b/api/places/views.py deleted file mode 100644 index c4dbd123..00000000 --- a/api/places/views.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.shortcuts import render - -from rest_framework import generics -from rest_framework.generics import get_object_or_404 -from rest_framework.permissions import IsAuthenticated -from rest_framework import viewsets, mixins -from rest_framework.decorators import action -from rest_framework.response import Response - -from .models import Place, Room -from .serializers import PlaceSerializer, RoomSerializer -from .permissions import IsOwnerOrReadOnly - -class PlaceViewSet(viewsets.ModelViewSet): - queryset = Place.objects.all() - serializer_class = PlaceSerializer - permission_classes = [] - - @action(detail=True, methods=['get']) - def rooms(self, request, pk=None): - place = self.get_object() - serializer = RoomSerializer(place.rooms.all(), many=True) - return Response(serializer.data) - - @action(detail=True, methods=['get'], url_path='rooms/(?P\d+)') - def room(self, request, pk=None, room_pk=None): - place = self.get_object() - room = get_object_or_404(place.rooms.all(), pk=room_pk) - serializer = RoomSerializer(room) - return Response(serializer.data) - -class RoomViewSet(viewsets.ModelViewSet): - queryset = Room.objects.all() - serializer_class = RoomSerializer - permission_classes = [] \ No newline at end of file diff --git a/api/requirements.txt b/api/requirements.txt deleted file mode 100644 index 9268dd4e..00000000 --- a/api/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -asgiref==3.7.2 -async-timeout==4.0.3 -Django==4.2 -django-cors-headers==4.3.1 -django-redis==5.4.0 -django-redis-session-store==0.1.1 -django-redis-sessions==0.6.2 -djangorestframework==3.14.0 -mysqlclient==2.2.4 -pytz==2024.1 -redis==5.0.3 -sqlparse==0.4.4 diff --git a/api/sigeie/settings.py b/api/sigeie/settings.py deleted file mode 100644 index 30273ec0..00000000 --- a/api/sigeie/settings.py +++ /dev/null @@ -1,123 +0,0 @@ -from pathlib import Path - -BASE_DIR = Path(__file__).resolve().parent.parent - -SECRET_KEY = 'django-insecure-vy00e(4im2%orzf_b+dv6k$6)%c$8zfjgb6vb^hd^ugxfqpk1)' - -DEBUG = True - -ALLOWED_HOSTS = ['127.0.0.1', '10.0.2.2'] - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'corsheaders', - 'users', - 'places', - 'systems' -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - "corsheaders.middleware.CorsMiddleware", - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'sigeie.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'sigeie.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/4.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'HOST': '127.0.0.1', - 'PORT': '3306', - 'USER': 'root', - 'PASSWORD': 'root', - 'NAME': 'sigeie_db', - 'OPTIONS': { - 'init_command': "SET sql_mode ='STRICT_TRANS_TABLES'" - } - } -} - -CACHES = { - 'default': { - 'BACKEND': 'django_redis.cache.RedisCache', - 'LOCATION': 'redis://localhost:6379', - 'OPTIONS': { - 'CLIENT_CLASS': 'django_redis.client.DefaultClient', - } - } -} - -SESSION_ENGINE = 'django.contrib.sessions.backends.cache' - -SESSION_CACHE_ALIAS = 'default' - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - -STATIC_URL = 'static/' -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -REST_FRAMEWORK = { - 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework.authentication.SessionAuthentication', - ], - 'DEFAULT_PERMISSION_CLASSES': { - 'rest_framework.permissions.IsAuthenticatedOrReadOnly', - } -} - -CORS_ALLOW_ALL_ORIGINS = True \ No newline at end of file diff --git a/api/sigeie/urls.py b/api/sigeie/urls.py deleted file mode 100644 index c44d28d7..00000000 --- a/api/sigeie/urls.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -URL configuration for sigeie project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/4.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path, include -from places.urls import router - -urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', include('users.urls')), - path('api/', include(router.urls)), - path('api/', include('systems.urls')), - path('auth/', include('rest_framework.urls')) -] diff --git a/api/systems/models.py b/api/systems/models.py deleted file mode 100644 index ed104f43..00000000 --- a/api/systems/models.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.db import models - -class System(models.Model): - - name = models.CharField(max_length=50) - - def __str__(self): - return self.name diff --git a/api/systems/serializers.py b/api/systems/serializers.py deleted file mode 100644 index a7e01212..00000000 --- a/api/systems/serializers.py +++ /dev/null @@ -1,7 +0,0 @@ -from rest_framework import serializers -from .models import System - -class SystemSerializer(serializers.ModelSerializer): - class Meta: - model = System - fields = ['id', 'name'] diff --git a/api/systems/urls.py b/api/systems/urls.py deleted file mode 100644 index 0f12d8fa..00000000 --- a/api/systems/urls.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.urls import path, include -from .views import SystemViewDetail, SystemViewList - -urlpatterns = [ - path('systems/', SystemViewList.as_view()), - path('systems//', SystemViewDetail.as_view()) -] - diff --git a/api/systems/views.py b/api/systems/views.py deleted file mode 100644 index 9d14da17..00000000 --- a/api/systems/views.py +++ /dev/null @@ -1,13 +0,0 @@ -from rest_framework import viewsets, generics -from .models import System -from .serializers import SystemSerializer - -class SystemViewList(generics.ListAPIView): - queryset = System.objects.all() - serializer_class = SystemSerializer - permission_classes = [] - -class SystemViewDetail(generics.RetrieveAPIView): - queryset = System.objects.all() - serializer_class = SystemSerializer - permission_classes = [] \ No newline at end of file diff --git a/api/users/models.py b/api/users/models.py deleted file mode 100644 index 41229132..00000000 --- a/api/users/models.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.db import models - -# Create your models here - - - diff --git a/api/users/serializers.py b/api/users/serializers.py deleted file mode 100644 index 705c1c4c..00000000 --- a/api/users/serializers.py +++ /dev/null @@ -1,29 +0,0 @@ -# serializers.py -from rest_framework import serializers, response -from django.contrib.auth.models import User - -class UserSerializer(serializers.ModelSerializer): - - class Meta: - model = User - fields = ['id', 'password', 'username', 'first_name', 'email', 'is_active', 'date_joined', 'groups'] - extra_kwargs = { - 'password': {'write_only': True}, - 'first_name': {'required': True}, - 'email': {'required': True}, - 'is_active': {'read_only': True}, - 'date_joined': {'read_only': True}, - 'groups': {'read_only': True} - } - - def create(self, validated_data): - user = User.objects.create_user( - username=validated_data['username'], - password=validated_data['password'], - email=validated_data.get('email') # use get se o email for opcional - ) - return user - -class UserSerializerP(serializers.Serializer): - username = serializers.CharField(max_length=200) - password = serializers.CharField(max_length=200) \ No newline at end of file diff --git a/api/users/views.py b/api/users/views.py deleted file mode 100644 index c6120c26..00000000 --- a/api/users/views.py +++ /dev/null @@ -1,52 +0,0 @@ -# views.py -from django.http import JsonResponse -from rest_framework import viewsets, permissions, status -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework.permissions import IsAuthenticated -from rest_framework.authentication import BasicAuthentication -from rest_framework import generics -from django.views.decorators.csrf import csrf_protect, csrf_exempt -from .permissions import IsOwner -from .serializers import UserSerializer, UserSerializerP - -from django.contrib.auth.models import User -from django.contrib.auth import authenticate, login, logout -from django.utils.decorators import method_decorator - -@method_decorator(csrf_protect, name='dispatch') -class UserCreateView(generics.CreateAPIView): - queryset = User.objects.all() - serializer_class = UserSerializer - permission_classes = [] - authentication_classes = [] - -@method_decorator(csrf_protect, name='dispatch') -class UserDetailView(generics.RetrieveUpdateDestroyAPIView): - queryset = User.objects.all() - serializer_class = UserSerializer - permission_classes = [IsOwner, IsAuthenticated] - -@method_decorator(csrf_protect, name='dispatch') -class LoginView(APIView): - permission_classes = [] - def post(self, request, format=None): - serializer = UserSerializerP(data=request.data) - if(serializer.is_valid()): - username = serializer.validated_data["username"] - password = serializer.validated_data["password"] - user = authenticate(username=username, password=password) - if user is not None: - login(request, user) - return Response({'message': 'Login successful'}, status=status.HTTP_200_OK) - else: - print(user) - return Response({'message': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED) - return JsonResponse(serializer.errors) - -class LogoutView(APIView): - permission_classes = [permissions.IsAuthenticated] - - def post(self, request, format=None): - logout(request) - return Response({'message': 'Logout successful'}, status=status.HTTP_200_OK) diff --git a/docs/info/Roadmap.md b/docs/info/Roadmap.md new file mode 100644 index 00000000..68445de3 --- /dev/null +++ b/docs/info/Roadmap.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 59a22098..149f074a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -50,6 +50,9 @@ nav: - Arquitetura: info/arquitetura.md - Modelagem Banco de dados: info/modelagemBD.md + - RoadMap: + - RoadMap: info/Roadmap.md + plugins: - search - with-pdf