Skip to content

Instantly share code, notes, and snippets.

@rg3915
Last active March 31, 2023 07:01
Show Gist options
  • Save rg3915/511dd35be514d9379a4f3bc4fe235761 to your computer and use it in GitHub Desktop.
Save rg3915/511dd35be514d9379a4f3bc4fe235761 to your computer and use it in GitHub Desktop.
Create templates to Django app dj_scaffold
#!/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