Last active
March 31, 2023 07:01
-
-
Save rg3915/511dd35be514d9379a4f3bc4fe235761 to your computer and use it in GitHub Desktop.
Create templates to Django app dj_scaffold
This file contains hidden or 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
#!/bin/bash | |
# Run this code with manager.py folder. | |
# Usage: $ ~/.dj_scaffold.sh crm person | |
<<comment | |
Create templates | |
* _list.html | |
* _detail.html | |
* _form.html | |
And edit | |
* urls.py | |
* views.py | |
* forms.py | |
comment | |
APPNAME=$1 | |
MODEL=$2 | |
MODEL_CAP=$(echo $MODEL | sed 's/^./\U&\E/g') | |
mkdir -p $(pwd)/backend/${APPNAME}/templates/${APPNAME}/includes | |
# Search for the string "verbose_name = " in the specified file | |
verbose_name=$(grep "verbose_name = " $(pwd)/backend/${APPNAME}/models.py | \ | |
# Extract the word after "verbose_name = " and capitalize the first character | |
awk -F"'" '{print toupper(substr($2,1,1)) substr($2,2)}') | |
# Search for the string "verbose_name_plural " in the specified file | |
verbose_name_plural=$(grep "verbose_name_plural " $(pwd)/backend/${APPNAME}/models.py | \ | |
# Extract the word after "verbose_name_plural = " and capitalize the first character | |
awk -F"'" '{print toupper(substr($2,1,1)) substr($2,2)}') | |
templates=('list' 'detail' 'form') | |
# Create templates | |
# for template in "${templates[@]}" | |
# do | |
# cat > "$(pwd)/backend/${APPNAME}/templates/${APPNAME}/${MODEL}_${template}.html" << EOF | |
# <!-- ${MODEL}_${template}.html --> | |
# {% extends "base.html" %} | |
# {% block content %} | |
# {% endblock content %} | |
# EOF | |
# done | |
# Write _list.html | |
cat << EOF > "$(pwd)/backend/${APPNAME}/templates/${APPNAME}/${MODEL}_list.html" | |
<!-- ${MODEL}_list.html --> | |
{% extends "base.html" %} | |
{% block content %} | |
<div> | |
<div class="row"> | |
<div class="col-auto"> | |
<h1>Lista de ${verbose_name_plural}</h1> | |
</div> | |
<div class="col-auto"> | |
<a class="btn btn-primary" href="{% url '${APPNAME}:${MODEL}_create' %}">Adicionar</a> | |
</div> | |
<div class="col"> | |
<form action="." method="GET" class="form-inline"> | |
<div class="form-group flex-grow-1"> | |
<input id="id_search" name="search" class="form-control flex-grow-1" type="text" placeholder="Buscar..." /> | |
</div> | |
<div class="form-group pl-2"> | |
<button type="submit" class="btn btn-success">Buscar</button> | |
</div> | |
<div class="form-group pl-2"> | |
<a class="btn btn-link" href=".">Limpar</a> | |
</div> | |
</form> | |
</div> | |
</div> | |
<table class="table"> | |
<thead> | |
<tr> | |
<th>Nome</th> | |
<th></th> | |
<th>Ações</th> | |
</tr> | |
</thead> | |
<tbody> | |
{% for object in object_list %} | |
<tr> | |
<td> | |
<a href="{{ object.get_absolute_url }}">{{ object }}</a> | |
</td> | |
<td></td> | |
<td> | |
<a href="{% url '${APPNAME}:${MODEL}_update' object.pk %}"> | |
<i class="fa fa-edit"></i> | |
</a> | |
<a href="{% url '${APPNAME}:${MODEL}_delete' object.pk %}" class="pl-2"> | |
<i class="fa fa-close no"></i> | |
</a> | |
</td> | |
</tr> | |
{% endfor %} | |
</tbody> | |
</table> | |
</div> | |
{% include "includes/pagination.html" %} | |
{% endblock content %} | |
EOF | |
# Write _detail.html | |
cat << EOF > "$(pwd)/backend/${APPNAME}/templates/${APPNAME}/${MODEL}_detail.html" | |
<!-- ${MODEL}_detail.html --> | |
{% extends "base.html" %} | |
{% block content %} | |
<h1>Detalhes de {{ object }}</h1> | |
<ul> | |
{% for field in object.get_fields_verbose_names %} | |
<li><b>{{ field.name }}:</b> {{ field.value|default:'---' }}</li> | |
{% endfor %} | |
</ul> | |
{% endblock content %} | |
EOF | |
# Write _form.html | |
cat << EOF > "$(pwd)/backend/${APPNAME}/templates/${APPNAME}/${MODEL}_form.html" | |
<!-- ${MODEL}_form.html --> | |
{% extends "base.html" %} | |
{% load static %} | |
{% load widget_tweaks %} | |
{% block content %} | |
<h1>{% if object.pk %}Editar{% else %}Adicionar{% endif %} ${verbose_name}</h1> | |
<div class="cols-6"> | |
<form class="form-horizontal" action="." method="POST" enctype="multipart/form-data"> | |
<div class="col-sm-6"> | |
{% csrf_token %} | |
{% for field in form.visible_fields %} | |
<div class="mt-2 form-group{% if field.errors %} has-error {% endif %}"> | |
<label for="{{ field.id_for_label }}"> | |
{% if field.field.required %} | |
<span class="required">{{ field.label }}</span> | |
{% else %} | |
{{ field.label }} | |
{% endif %} | |
</label> | |
{% render_field field class="form-control" %} | |
{% for error in field.errors %} | |
<span class="text-muted">{{ error }}</span> | |
{% endfor %} | |
</div> | |
{% endfor %} | |
</div> | |
</form> | |
</div> | |
{% endblock content %} | |
EOF | |
# Write urls.py | |
# check if the urls.py file exists | |
if [ ! -f "$(pwd)/backend/${APPNAME}/urls.py" ]; then | |
# create the urls.py file and write the import statement | |
cat << EOF > "$(pwd)/backend/${APPNAME}/urls.py" | |
from django.urls import include, path | |
from backend.${APPNAME} import views as v | |
app_name = '${APPNAME}' | |
${MODEL}_patterns = [ | |
path('', v.${MODEL_CAP}ListView.as_view(), name='${MODEL}_list'), | |
path('<int:pk>/', v.${MODEL_CAP}DetailView.as_view(), name='${MODEL}_detail'), | |
path('create/', v.${MODEL_CAP}CreateView.as_view(), name='${MODEL}_create'), | |
path('<int:pk>/update/', v.${MODEL_CAP}UpdateView.as_view(), name='${MODEL}_update'), | |
path('<int:pk>/delete/', v.${MODEL_CAP}DeleteView.as_view(), name='${MODEL}_delete'), | |
] | |
urlpatterns = [ | |
] | |
urlpatterns += [ | |
path('', include(${MODEL}_patterns)), | |
] | |
EOF | |
else | |
# check if the model patterns already exist in the file | |
if ! grep -q "path('${MODEL}/', include(${MODEL}_patterns))," "$(pwd)/backend/${APPNAME}/urls.py"; then | |
# append the model patterns to the file | |
cat << EOF >> "$(pwd)/backend/${APPNAME}/urls.py" | |
${MODEL}_patterns = [ | |
path('', v.${MODEL_CAP}ListView.as_view(), name='${MODEL}_list'), | |
path('<int:pk>/', v.${MODEL_CAP}DetailView.as_view(), name='${MODEL}_detail'), | |
path('create/', v.${MODEL_CAP}CreateView.as_view(), name='${MODEL}_create'), | |
path('<int:pk>/update/', v.${MODEL_CAP}UpdateView.as_view(), name='${MODEL}_update'), | |
path('<int:pk>/delete/', v.${MODEL_CAP}DeleteView.as_view(), name='${MODEL}_delete'), | |
] | |
urlpatterns += [ | |
path('${MODEL}/', include(${MODEL}_patterns)), | |
] | |
EOF | |
fi | |
fi | |
# move urlpatterns to the end of file | |
sed -i -e '/^urlpatterns = \[/,$!b' -e '${/^urlpatterns = \[/,+1{H;d};G}' "$(pwd)/backend/${APPNAME}/urls.py" | |
# Write views.py | |
# check if the views.py file exists | |
if [ ! -f "$(pwd)/backend/${APPNAME}/views.py" ]; then | |
# create the views.py file and write the import statement | |
cat << EOF > "$(pwd)/backend/${APPNAME}/views.py" | |
from django.shortcuts import render | |
from django.urls import reverse_lazy | |
from django.views.generic import ( | |
CreateView, | |
DeleteView, | |
DetailView, | |
ListView, | |
UpdateView | |
) | |
from .forms import ${MODEL_CAP}Form | |
from .models import ${MODEL_CAP} | |
class ${MODEL_CAP}ListView(ListView): | |
model = ${MODEL_CAP} | |
paginate_by = 10 | |
class ${MODEL_CAP}DetailView(DetailView): | |
model = ${MODEL_CAP} | |
class ${MODEL_CAP}CreateView(CreateView): | |
model = ${MODEL_CAP} | |
form_class = ${MODEL_CAP}Form | |
# success_url = reverse_lazy('${APPNAME}:${MODEL}_list') | |
class ${MODEL_CAP}UpdateView(UpdateView): | |
model = ${MODEL_CAP} | |
form_class = ${MODEL_CAP}Form | |
# success_url = reverse_lazy('${APPNAME}:${MODEL}_list') | |
class ${MODEL_CAP}DeleteView(DeleteView): | |
model = ${MODEL_CAP} | |
success_url = reverse_lazy('${APPNAME}:${MODEL}_list') | |
EOF | |
else | |
# check if the model patterns already exist in the file | |
if ! grep -q "from django.shortcuts import render" "$(pwd)/backend/${APPNAME}/views.py"; then | |
# append the model patterns to the file | |
cat << EOF >> "$(pwd)/backend/${APPNAME}/views.py" | |
from .forms import ${MODEL_CAP}Form | |
from .models import ${MODEL_CAP} | |
class ${MODEL_CAP}ListView(ListView): | |
model = ${MODEL_CAP} | |
paginate_by = 10 | |
class ${MODEL_CAP}DetailView(DetailView): | |
model = ${MODEL_CAP} | |
class ${MODEL_CAP}CreateView(CreateView): | |
model = ${MODEL_CAP} | |
form_class = ${MODEL_CAP}Form | |
# success_url = reverse_lazy('${APPNAME}:${MODEL}_list') | |
class ${MODEL_CAP}UpdateView(UpdateView): | |
model = ${MODEL_CAP} | |
form_class = ${MODEL_CAP}Form | |
# success_url = reverse_lazy('${APPNAME}:${MODEL}_list') | |
class ${MODEL_CAP}DeleteView(DeleteView): | |
model = ${MODEL_CAP} | |
success_url = reverse_lazy('${APPNAME}:${MODEL}_list') | |
EOF | |
fi | |
fi | |
# Write forms.py | |
# check if the forms.py file exists | |
if [ ! -f "$(pwd)/backend/${APPNAME}/forms.py" ]; then | |
# create the forms.py file and write the import statement | |
cat << EOF > "$(pwd)/backend/${APPNAME}/forms.py" | |
from django import forms | |
from .models import ${MODEL_CAP} | |
class ${MODEL_CAP}Form(forms.ModelForm): | |
class Meta: | |
model = ${MODEL_CAP} | |
fields = '__all__' | |
EOF | |
else | |
# check if the model patterns already exist in the file | |
if ! grep -q "from django.shortcuts import render" "$(pwd)/backend/${APPNAME}/forms.py"; then | |
# append the model patterns to the file | |
cat << EOF >> "$(pwd)/backend/${APPNAME}/forms.py" | |
from .models import ${MODEL_CAP} | |
class ${MODEL_CAP}Form(forms.ModelForm): | |
class Meta: | |
model = ${MODEL_CAP} | |
fields = '__all__' | |
EOF | |
fi | |
fi | |
isort -m 3 * | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment