Skip to content
Merged

Dev #66

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
154 changes: 128 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,137 @@
# Repositório de Propostas e projetos de Ensino, Pesquisa e Extensão - REPEX
Para usar o sistema, siga esses passos:
Os projetos de ensino, pesquisa e extensão do IFRN carecem de uma plataforma web centralizada e acessível para divulgação. Este projeto propõe o desenvolvimento de um sistema web de código aberto e totalmente replicável/personalizável pelo cliente, utilizando o framework Django, que permita a divulgação de projetos em andamento, concluídos e de propostas para prospectar alunos e parceiros interessados.

## Para usar o login com suap, crie uma aplicação aouth2 e configure a redirect URI:
<seu-domínio>/users/auth/callback/
#### URL em ambiente de desenvolvimento:
http://localhost:8000/users/auth/callback/
http://127.0.0.1:8000/users/auth/callback/
## Tecnologias Utilizadas
- Python 3.13
- Django 5.2.5
- Banco de dados: Postgres

## Pré-requisitos
- Python 3.8 ou superior
- MySQL
- Git

### Após clonar o sistema, ative a venv e instale as dependências:
pip install -r requirements.txt
## Instalação e Configuração

## Caso esteja em ambiente de desenvolvimento, defina debug=True e troque o conteúdo de DATABASES por:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
### 1. Clone o repositório
```bash
git clone https://github.com/IFRN-SPP/repex.git
cd repex
```

### Após isso faça as migrações:
python .\manage.py migrate
### 2. Crie e ative um ambiente virtual

### Crie o arquivo .env e adicione:
SUAP_CLIENT_ID = <seu-client-id>
SUAP_CLIENT_SECRET = <seu-client-secret>
SECRET_KEY = desenvolvimento (Use outra em ambiente de produção)
REDIRECT_URI = http://127.0.0.1:8000/users/auth/callback/ (Use <seu-dominio>/users/auth/callback/ em ambiente de produção)
**Windows:**
```bash
python -m venv venv
venv\Scripts\activate
```

### Por fim, rode:
python .\manage.py runserver
**Linux/Mac:**
```bash
python3 -m venv venv
source venv/bin/activate
```

### Caso necessário, instale objetos prontos para visualização do sistema funcional (apenas após o primeiro login realizado):
python .\manage.py loaddata .\repex\fixtures\exemplo.json
### 3. Instale as dependências
```bash
pip install -r requirements.txt
```
Este comando irá instalar todas as bibliotecas necessárias listadas no arquivo `requirements.txt`.

### 4. Configure as variáveis de ambiente

```bash
cp .env.example .env
```

### 5. Execute as migrações do banco de dados

```bash
python manage.py migrate
```

### 6. (Opcional) Crie um superusuário

Para acessar o painel administrativo do Django:

```bash
python manage.py createsuperuser
```

### 7. Execute o servidor
```bash
python manage.py runserver
```

Acesse: http://localhost:8000

## Estrutura do Projeto

```
REPEX/
├── config/ # Arquivos de configuração para aplicação do Django
├── docs/ # Documentação
│ ├── imgs/ # Imagens do do usuário
│ ├── README.md # Detalhes da engenharia de software
|
├── repex/ # App principal do sistema
│ ├── fixtures/ # Objetos prontos para testes
│ ├── templates/ # Páginas HTML
│ | ├── partials/ # Estruturas HTML parceladas
│ ├── templatetags/ # Funções extras para templates
│ | ├── news_extras.py # Função para fazer com que o carrossel de notícias funcione
│ ├── __init__.py # Arquivo de execução do django
│ ├── admin.py # Arquivo de execução do django admin
│ ├── apps.py # Arquivo de execução de app do django
│ ├── context_processors.py # Funções que renderizam dados em todas as páginas do sistema
│ ├── forms.py # Configuração de formulários
│ ├── models.py # Estrutura do banco de dados
│ ├── urls.py # Caminhos das páginas e funções
│ ├── views.py # Lógica, execução e renderização de dados das páginas e funções
|
├── users/ # App relativo aos usuários do sistema
│ ├── templates/ # Páginas HTML
│ ├── __init__.py # Arquivo de execução do django
│ ├── admin.py # Arquivo de execução do django admin
│ ├── apps.py # Arquivo de execução de app do django
│ ├── forms.py # Configuração de formulários
│ ├── managers.py # Configuração de criação de usuário via terminal
│ ├── models.py # Estrutura do banco de dados
│ ├── oauthlib_client.py # Função para login com Suap
│ ├── signals.py # Definição do grupo e permissões de professor
│ ├── urls.py # Caminhos das páginas e funções
│ ├── views.py # Lógica, execução e renderização de dados das páginas e funções
|
├── .env # Variáveis de ambiente (NÃO vai pro Git)
├── .env.example # Modelo de variáveis de ambiente
├── .gitignore # Arquivos ignorados pelo Git
|
├── LICENSE # Licença do projeto
|
├── manage.py # Script principal do Django
|
├── README.md # Este arquivo
├── requirements-prod.txt # Dependências do projeto para produção
├── requirements.txt # Dependências do projeto

```

---

## Funcionalidades
- Gerenciamento do sistema de forma simplificada
- Autenticação e gestão de usuários (registro, login, logout)
- Gerenciamento de projetos e notícias
- Painel administrativo

## Autores
- [Wescley Plínio Damasceno Galdino](https://github.com/WescleyPlinio)
- [Ellainy Nayara Motta dos Santos](https://github.com/ellainy)
- [João Henrique de Oliveira Silva](https://github.com/joaohenrique15)

## Licença
- Veja os detalhes em [Licença MIT](LICENSE)
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Engenharia de software - REPEX
Documentação de engenharia de software. [Clique aqui para ver a documentação técnica do Repex](code.md)
Documentação de engenharia de software.

## Sumário
- [Resumo](#resumo)
Expand Down
61 changes: 0 additions & 61 deletions docs/code.md

This file was deleted.

14 changes: 13 additions & 1 deletion repex/forms.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
from django import forms
from django_select2.forms import Select2MultipleWidget
from .models import Projeto, FotoProjeto, IdentidadeVisual
from .models import Projeto, FotoProjeto, IdentidadeVisual, UserSocialLink
from crispy_forms.layout import Layout, Field
from crispy_forms.helper import FormHelper
from tinymce.widgets import TinyMCE

class MultiFileInput(forms.ClearableFileInput):
allow_multiple_selected = True

class UserSocialLinkForm(forms.ModelForm):
class Meta:
model = UserSocialLink
fields = [
"rede",
"url",
]
labels = {
"rede": "Selecione uma rede social:",
"url": "Digite o seu username:"
}

class ProjetoForm(forms.ModelForm):
class Meta:
model = Projeto
Expand Down
1 change: 1 addition & 0 deletions repex/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
Repex
{% endblock %}
</title>
<link rel="icon" href="{% static 'imgs/favicon.svg' %}" type="image/svg+xml">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
Expand Down
14 changes: 1 addition & 13 deletions repex/templates/identidade_visual_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,4 @@ <h3 style="color:{{ identidade_visual.cor_sistema }};" class="mb-3">{% if form.i
<a class="btn btn-primary" href="{% url "painel" %}">Cancelar</a>
</div>
</form>
{% endblock %}
{% block extra_scripts %}
<script>
const input = document.getElementById('id_cor_suplente');
const defaultValue = input.value;

input.form.addEventListener('submit', () => {
if (input.value === defaultValue) {
input.disabled = true;
}
});
</script>
{% endblock extra_scripts %}
{% endblock %}
15 changes: 8 additions & 7 deletions repex/templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -140,27 +140,28 @@ <h4 class="m-auto p-5 text-white">
<div class="carousel-shell mb-5">
<h4 class="fw-bold" style="color: {{ identidade_visual.cor_sistema }};">Últimos projetos adicionados:</h4>
<div class="carousel-viewport">
<div class="carousel-track w-100" id="cardTrack">
<div class="carousel-track w-100 d-flex gap-2 flex-nowrap overflow-auto" id="cardTrack">
{% for projeto in projetos %}
<div class="card-item">
<div class="card-item flex-shrink-0 py-1">
{% include 'partials/_card.html' %}
</div>
{% endfor %}
</div>
</div>

{% if projetos.exists %}
<button class="btn btn-light carousel-control carousel-prev" id="prevBtn" style="color: blue;"
aria-label="Anterior">‹</button>
<button class="btn btn-light carousel-control carousel-next" id="nextBtn" style="color: blue;"
aria-label="Próximo">›</button>
{% endif %}
</div>

<div class="carousel-shell mb-5">
<h4 class="fw-bold" style="color: {{ identidade_visual.cor_sistema }};">Conheça projetos:</h4>
<div class="carousel-viewport">
<div class="carousel-track w-100" id="cardTrack">
<div class="carousel-track w-100 d-flex gap-2 flex-nowrap overflow-auto" id="cardTrack">
{% for projeto in projetos_random %}
<div class="card-item">
<div class="card-item flex-shrink-0 py-1">
{% include 'partials/_card.html' %}
</div>
{% endfor %}
Expand All @@ -177,9 +178,9 @@ <h4 class="fw-bold" style="color: {{ identidade_visual.cor_sistema }};">Conheça
<div class="carousel-shell mb-5">
<h4 class="fw-bold" style="color: {{ identidade_visual.cor_sistema }};">Projetos mais vistos:</h4>
<div class="carousel-viewport">
<div class="carousel-track w-100" id="cardTrack">
<div class="carousel-track w-100 d-flex gap-2 flex-nowrap overflow-auto" id="cardTrack">
{% for projeto in projetos_mais_vistos %}
<div class="card-item">
<div class="card-item flex-shrink-0 py-1">
{% include 'partials/_card.html' %}
</div>
{% endfor %}
Expand Down
2 changes: 2 additions & 0 deletions repex/templates/partials/_navbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
<a class="nav-link text-white fw-bold" href="{% url 'explorar' %}">Explorar</a>
</li>
{% if user.is_authenticated %}
<li class="nav-item">
<div class="dropdown">
<button class="btn btn-transparent text-white dropdown-toggle fw-bold" type="button" data-bs-toggle="dropdown" aria-expanded="false">Perfil</button>
<ul class="dropdown-menu">
Expand All @@ -66,6 +67,7 @@
</li>
</ul>
</div>
</li>
{% else %}
<div class="btn-group-minimal">
<li class="nav-item">
Expand Down
2 changes: 1 addition & 1 deletion repex/templates/profile_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<div style="width: 100%; aspect-ratio: 1 / 1;" class="bg-body-tertiary rounded-circle d-flex">
<a href="{% url 'perfil_update' request.user.id %}" class="text-decoration-none m-auto p-5">
<i class="fa-solid fa-image"></i>
Adicione sua foto de perfil
Adicione seu avatar
</a>
</div>
{% else %}
Expand Down
3 changes: 0 additions & 3 deletions repex/tests.py

This file was deleted.

6 changes: 3 additions & 3 deletions repex/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.core.paginator import Paginator
from django.template.loader import render_to_string
from django.http import JsonResponse, HttpResponseRedirect
from .forms import ProjetoForm, IdentidadeVisualForm
from .forms import ProjetoForm, IdentidadeVisualForm, UserSocialLinkForm
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
Expand Down Expand Up @@ -232,7 +232,7 @@ def test_func(self):

class UserSocialLinkCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = UserSocialLink
fields = ["rede", "url"]
form_class = UserSocialLinkForm
template_name = "profile_rede_social_form.html"
success_message = "Rede social pessoal adicionada com sucesso!"
success_url = reverse_lazy("dashboard")
Expand Down Expand Up @@ -305,7 +305,7 @@ def test_func(self):

class RedeSocialUpdateView(LoginRequiredMixin, UserPassesTestMixin ,SuccessMessageMixin, UpdateView):
model = RedeSocial
fields = ['nome', 'url_base']
form_class = UserSocialLinkForm
template_name = 'rede_social_form.html'
success_message = 'Rede social atualizada com sucesso!'
success_url = reverse_lazy('painel')
Expand Down
4 changes: 4 additions & 0 deletions static/imgs/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading