From a195d0853c49b4e7cf8ef483f587d1a3d2d373f0 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 16 Feb 2026 01:19:44 +0000 Subject: [PATCH] Nota: Clique em Salvar no editor Flatlogic para pe --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 19874 bytes core/__pycache__/admin.cpython-311.pyc | Bin 2159 -> 3178 bytes core/__pycache__/models.cpython-311.pyc | Bin 6064 -> 7465 bytes core/__pycache__/urls.cpython-311.pyc | Bin 747 -> 935 bytes core/__pycache__/views.cpython-311.pyc | Bin 5566 -> 9968 bytes core/admin.py | 21 ++- ...l_description_project_category_and_more.py | 48 ++++++ ..._project_category_and_more.cpython-311.pyc | Bin 0 -> 2319 bytes core/models.py | 19 ++- core/templates/core/index.html | 23 ++- core/templates/core/project_detail.html | 148 +++++++++++------- core/templates/core/studio_ai.html | 79 ++++++++++ core/urls.py | 16 +- core/views.py | 107 ++++++++++++- 15 files changed, 380 insertions(+), 81 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc create mode 100644 core/migrations/0004_cgiasset_physical_description_project_category_and_more.py create mode 100644 core/migrations/__pycache__/0004_cgiasset_physical_description_project_category_and_more.cpython-311.pyc create mode 100644 core/templates/core/studio_ai.html diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9beeae7341d797e2eac5af07416a24e9ee781f92 GIT binary patch literal 404 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 delta 905 zcmZ{i!E4h{9LMw0CND{ww6m`5u+_D5cG-66ik@^L6NjL6Fi%C0*!QTJT{~XVlOP4X z3f6b?9}qzXyL<5B&BMTfl9ShYaYI4a$@hCLvlPrrKKcEA-{hCy@AvW}|1<5pwQWlg z$5-;&e;*q-dG#?GER@qoQI&Ot#9t^xqi9PX?B-HfhIA3aqYyS!MVRK`bI~+J+!T&A z*v;|{HH8yHjh{zF(-LB0TuhF{9U&%#Xpe~nn>d?_n>vKTToh>@+4eh!2)r17s+Rbk z`aw5^%S;}`=JoW@EEyI4DORaLLo5ME0x-Y^IDiyDzA*(>MuK06&(F#r_)T%09_q;Y zwaB00+(JVmaiaOCp;JtamfA3hE{erba)WiZXfwP4#kz4`*RuEYAoRjs5Lrz|y^xZJ zUg)YUCo;0UfUvXT79|J`n#|t`{cb0U2kl-%$-be=2>YG3-=V=| zOVf}a0PP1W0{zqVJ#({v=i8ZO?&-PozO&L_hc%qXG%p!f_(y&9`bEfaNud5t8!rID z1waunG08H-0B89%TpDglS*Co0r*xTej_=`FcM%?35~#BZm=k$ihyiB!2`(k&u7F#2 z9sb;0ZbtTf?@_PqvD>nJ_HQ5tqb)xODT}PTT|(P(E94|(T{7v!*G`P9+g;LY(^Xa# z-++HCc!Kznb*@m`SN?nQj`e{5u`<=#k)okVyt;glnL7sIH{dv?s51vBf20bBuO(hO Lii)a706F--&?mjC diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 3fec2a3fa8f03da87ac79f3dc592fc6ddace79e0..64e433c2f539aeb7bc5250b52a2f2c89e1a473e2 100644 GIT binary patch delta 2150 zcmZ`(TWA|c6y4Etwc6F{v06XmhvGPCgq_4e#<)(>SZ=B|FDKw6BucTe)~+2HSvIqh zTAL6nB@`75wKJ5Yqzw&}G$#6R38n2vp_Kkt0#RI*LRvyU`elRr)34rH#da#Ev)ZHk zICE!q?!B{eaCyM>g&=SYj6c)2lSkZ3u1551>6Py|6Z0mc^0ydOSh^mtbE!t;*kd*aygj1bG{-KFs9>ZH3F{g>qtdq7)UA1c#RVX?hnt=uHa~5x~1ftjicGtE{ zVm8mbDi+;!K|Kb=yE$F87CjFU1cdi_K;I6Aw~iqh4FBc~)mN127;=FbN2=d{i;Xp? z@+~ITSYX~ou_pNH2J)@#X`3A;&)G&2$^FsfvI(=GVkd?D0L$dQeGghDKic=(qL>~h zS-1a&y2wxL4HO~6j!<(C7Vl}#uaZDJbFl4p)xymLI8O2zdAPR?YAg^Tz*=?pQc$CYG!LQ88H z*eW^B9YCjv&Z)B4UdUC%_DA7w*pe72i;;>L$-hN@<_?lI?t*_+4lRyXXR?UgqpG$RJ9k`x)edJKuJ2FB)Pg05mhH-%&qc}Eum^1Nx`9wiTaO+$OZeTPxeb!HNz+PKH4CeXJk^B(i51-4`!riBBW3C@`Yf*}*W z0(4BvqUoeiTR$GxGdLbU3J$#mfEG#kuH_SFNesj9v&`pnHL1jgja>|fJh+{P2~yYv zKwR$j(^dQPlBr7PruAednbS_Bp=vZ-D=TB=-E;~qIDCS_Nr0-5OX^uA6^H3lGZ{Pz zHnPj_Zy%uy3iRakuK@B}&#J4PjQX4Ag?)vK6=C0srzC{SLbxJ?^U+nlr4X&~EsxA4 zzPrqKSNQJy8>`-q#l018N7>t1@pk4JtuwQ0vk2_$buCDHDF1+;sam z`ptM2;1XngH!{*p+Qf@?JVrecGA|CIE984|l?hv~F)6gH2V8>bqDL2}>ytCdQ0|7I02B#2tc6VHe9E-)HH zWmT@|tnUNpA#F0p4UT7vBf|X*1^dEv>aC07hP6CJFKy~0FI?mF*8T5d zY|&S@n50V3n10m{T_BTRyeCsM4clFa`>6U3z%8GRjXaK$?0@eNMteA(i!Mk1v)E1 z{+1%{_h>u{G@rT|k*FUx2D2+$~*mgFPV+}Gn+tBv92MwY%=H*z(EnHtWd>jA6Fh1g6Jiqan delta 1004 zcmZ{jO=uHA6vubcd~9~J$!<2O$)>f~;zz*NiY1gj4d(EY+~9psgrF{ zDO#aIgkIWrQo)N*Ek+T06!oeny$BK!1W$Tuq2NJKXVz9R)q(fty_w&NHn&m7NWxb#wc|w&cWPNrYo!GFge6x*CZ*7=_w;&T$T_qmZCG=@Iq}uY51fT#EN6%WD|tadlQcZ^1cZL(GHHcj|9czrQVWXT5<~Dv9)P>G zBghFMdp(?12=W}ape*Mp4Cp@WZ ZJ0_zTTIK$&rRn*ZHFItKKZM!DKLNB;;a~s& diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 2b5aa39c72e9bf748e2ac011a4dd0c815fccb6b7..fbac9b4ac1d436b782c7dce97c8239c7a7ac2347 100644 GIT binary patch literal 935 zcmZvazi-n(6vxl;%TMPABw}(;AoNQV zi=|vAmzxqopAbe^GLR{CBnjaNmW_xhcVr1g5Rottc>s%zIQk>@MMmg5|K@AP#5ogP zC^)f_NpdE(WKt^`g){LblU~VWIFnd1*_BL=Gsz`$YbA4=Gc$(-hx7k4{dh;gg=eT- zybwTH3Sp?Z2N&EhQAFS9UM)UAqP_jOARm08uDRin(ZWqYm~ z&PmbZ4sjhd%*>Lmq3=_T9*t6t>tWrlXu29E=XqDtN5wv|2-RFt8B!a2Jy*B+ zafOB2{i}|OJRgvrtJWOD>+gwBSHtYJ+Qr1xbmM6`9V&RBS$%ugqlQDpc&V5c6=S7h zCR7+og=19wJ~S;tMuaR6p~ClZgIq!_=Nr1@61v(^g*mFX?^&*=lDDMixi(b~ZTi|7 zYCWR%Y|7jGz}?}|Rib9{yBMTSi+r>2+4;%CRF))Zf;QOAcY+G+<~xm{X!7{cN&e*d z`_A|kgOU%W07?@`aCLLM7OZcd-(}G7p%Fl1E^m!X!JVD+I)kPU%>bHndHwWpP`rO; zGpPGe51>AmH%`5e@6KK_sQOS1pgL1oa_jS2aBq)2e8HgYLpy->zl{g1_Jl#phgJZs PX)ckA94q3Xd49V;#6I+d literal 747 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 B6VU(w delta 1709 zcmah}TTC2P7(R!Yoy%TkVPRSBEcb3Ph?icZjX+ycsufyj8Z$Aj+noWH&g_sgvjPbS z4^4a(PmC{Zf{9`p8e__XPi=hDHy4AE%)5!z#B5?}j1P_fIRnIM6VJ?iIsawO|9}7g z&s5%c*spyai-i%anb{8u)3FV$0dH;e9bc0$GLRu!vaRTft?H^B*27#EvLbd=kMg}_ z#cWO2U@ser6}PMPYP&|Su@id2uGMQnuiip>oe>618WF&HBMO)@>x|efv;}duS#ZAe z215f|qk*SUIun1yloNNcA6g{21vi8J$gJsQ-!+L_aEi1Q56h1*xMW1?;^%k1!aF$5 znE3KyjuZ>US)$No;Wm!ada;yf0t;yYaH{~`Nt0%JM{EwYfe@w-#1Y&|pNNfBFIUmQ z_7~~vq5IORup(?K^r}=x*E=<7RRmE5F{z68LR%1d8`I5bTVM90~GmV`J5 zYd%8XYp>T<(0uezwHc$INcBU8vIWU)vjq7v)Z5ak?6n@s2(2I^ydrN2-~~^xrcowB z7v)#z1385g^aq*XI2~7}`a^lARP=mlreJv{Au720LeW_yb+98WBO(E06q2IfDalK{ zOw-5U7=sLeFXx@2XD)fJ0#f>5k!EHR=N#K4r(w&^bDsdLqsJ0Tbgw%q- zp&vFo=UWLrlVB=FEmIYQV*xUlALFv23tsi3Im0d#vz9aKlss|{3}@+YZM~d09c-%K z8EC(bPx|r#apuju=ZojZN2g$t!#UT5S@xC}OsLG%2x z#aR2AYg+JjmY7z~GY#?rv%kcE_fO<$kxNYR8iP{+t_Z;T6*Mar1hfh_NRBL%%U~R( zV;vv2uomTyCJqF4BrDJFzaaW&#|VADN)uP`J%L{CB*zW$wy-LAtRV*rCK6`V19KV54dv<@$x0l`)l#>3}%i%b)8@PD8A0G zebiij`rb!_<)`m`G(zw9Bebm$m#sevw;+!WE!(L;xh9Vvi=a8rRU^`;=6vb66=Q;v-wNRQ&<-M!y??|Y|T zQmF(3;~)J;^=F=8{-%pyL=Gk|>oEC=K@4IwroqCO)3{Ek5$c2+VV2>T&lwc@o$!gmaWHA_B_^*+ME;^lpg`o^B$ z28URMZG<=mhYvj=4$&RH9SsbiFpBi~9ngFZuRr?HqY)jm5kqm$Ml6s=2{h49{!bgJ z<8kyScUXu5-gk^*%Cis;l`}i zNhX6GlsoPVWKMZ9hgmt@&mWBkWD1_lIQu(b@OfaA0shQUJ_;Yt3dqDfnN*;LC)-oO zybZYYM>{>9Wr7(xgJ%0@kJfgbQ+QNFClyv@`{$1Glt@EBCBWi&62BW@5C9pL4HJ_q z^YimpM9c0W)sPK+T~$O`Q6UObYO1g}TP00d|p%+aoX~kBrBk2|d6lrRb{(!_=SnG;5 zeq@(J&^5GEL|y7&6830hUBwzA(XMHlhjoqg7y>pp3|x410uA5#esv%VCm~ zdbT0T5H^UBiLR-3By&@IfHz6p!lo)|>J}!+4Qw_I3;R*?dau*O<{s?`60ucV!+ZbI z2w5{rwCskZ%p!;LOAtjmCGz*#?Oj zCW2UWr5rLRsR!Q6m_?$7R~_qK`2>lHo`NWnga|c7Jq^P=DT)ulJ73}!n&+t z%cM6OiPaEVrTI5$TaoyEsFJrP@s*Zj`qShM!_cs#`>Tl+FI{(O9ZB+rs?;EdJ}di` zVX3ydfp6NiQk=+ctWJM~xQ zB}Bx$GO8`3gR8w}Pq%wj{0Ph7&a8fCm=CP3B;zVgW%ckbt^)oS4sMYYEY<& z0n)~eQ0Z=(v{yYsuLElcWqv${uu32$g|Q zafQm;HA+L_A`R{0GwcY917Xn>7T=(8mL6tym^t-VX4=WkJ=t(`bGzX`FE|a+(M>03 z4RV&7vz)X&%$#-#SGTXag{!*{okDF;sJVrjlfD7UPJV9tlAE9VO?L9v2Kj4l{+g5i zWSE(Cit|r-w>Up2F1W=7Cw*m@DLSQvrTkIotewqtM1I@ zUH Biblioteca de Assets + + STUDIO AI (Criador Automático) +
{% if is_admin %} @@ -55,6 +58,9 @@ {% else %}
+ {% if project.is_ai_generated %} +
AI GENERATED
+ {% endif %}
{% endif %}
@@ -62,20 +68,23 @@

{{ project.title }}

- - {{ project.get_status_display }} - +
+ + {{ project.get_status_display }} + + {{ project.category }} +

{{ project.description|truncatewords:20 }}

- Progresso Geral - 85% + Status Pipeline + {% with last=project.steps.last %}{{ last.progress|default:0 }}{% endwith %}%
-
+
@@ -98,4 +107,4 @@ } .bg-cyan { background-color: var(--electric-cyan) !important; } -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/project_detail.html b/core/templates/core/project_detail.html index 2d25240..42cdab4 100644 --- a/core/templates/core/project_detail.html +++ b/core/templates/core/project_detail.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% load static %} -{% block title %}{{ project.title }} | Pipeline Detail{% endblock %} +{% block title %}{{ project.title }} | Studio AI Production{% endblock %} {% block content %}
@@ -15,13 +15,19 @@
- {{ project.get_status_display }} -

{{ project.title }}

+
+ {{ project.get_status_display }} + {% if project.is_ai_generated %} + AI GENERATED + {% endif %} + {{ project.category }} +
+

{{ project.title }}

{{ project.description }}

- Global Delivery + Status da Produção {% with last_step=project.steps.last %}{{ last_step.progress|default:0 }}{% endwith %}% @@ -33,71 +39,105 @@
-
-
-

CGI Production Pipeline

- -
+ + +
+ +
+
{% for step in steps %} -
-
-
-
- {{ forloop.counter }} -
-

{{ step.get_name_display }}

+
+
+
ETAPA {{ forloop.counter }}
+

{{ step.get_name_display }}

+
+ Progresso + {{ step.progress }}% +
+
+
- {% if step.is_completed %} - COMPLETO - {% else %} - {{ step.progress }}% - {% endif %}
- -
-
-
-
- {% empty %} -
-

Pipeline não inicializado. Configure as etapas no Admin.

- Adicionar Etapa +
{% endfor %}
- -
-
-

Assets Digitais

-
- {% for asset in assets %} -
-
- {{ asset.name }} - {{ asset.get_asset_type_display }} • {{ asset.current_stage }} + + +
+
+
+ {% for scene in scenes %} +
+
+
+ {{ scene.number }} +
+

{{ scene.title }}

+
+
+ {{ scene.description|linebreaks }}
- {% if asset.is_realistic %} - REALISTA - {% endif %}
{% empty %} -

Nenhum asset (personagens/cenários) vinculado.

+

Nenhuma cena gerada para este roteiro.

{% endfor %}
- -
-
Diretrizes de Qualidade
-
    -
  • ✓ Topologia limpa para rigging
  • -
  • ✓ Texturas 4K/8K PBR
  • -
  • ✓ Iluminação física (PBR)
  • -
  • ✓ Renderização em EXR Multi-camada
  • -
+
+
+ + +
+
+ {% for asset in assets %} + {% if asset.asset_type == 'CHAR' %} +
+
+
+ +
+
+

{{ asset.name }}

+ APARÊNCIA REALISTA +

Físico: {{ asset.physical_description }}

+
+
+ {% endif %} + {% empty %} +

Nenhum personagem definido no elenco.

+ {% endfor %}
-{% endblock %} \ No newline at end of file + + +{% endblock %} diff --git a/core/templates/core/studio_ai.html b/core/templates/core/studio_ai.html new file mode 100644 index 0000000..ebe8adc --- /dev/null +++ b/core/templates/core/studio_ai.html @@ -0,0 +1,79 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+
+
+
+ +

STUDIO AI AUTOMÁTICO

+

Crie Super-Produções (Filmes e Séries) totalmente automatizadas com IA.

+
+ +
+ {% csrf_token %} +
+ + +
+ +
+ + +
+ +
+ + +
A IA criará personagens reais, cenas e roteiro completo com base nisso.
+
+ +
+ +
+
+ +
+

A IA está gerando o roteiro, personagens e cenas... Aguarde o processamento cinematográfico.

+
+
+
+
+
+
+ + + + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index dc67e2f..9faee05 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,10 +1,12 @@ from django.urls import path -from .views import home, project_detail, asset_library, admin_login, admin_logout +from . import views urlpatterns = [ - path("", home, name="home"), - path("project//", project_detail, name="project_detail"), - path("assets/", asset_library, name="asset_library"), - path("studio-admin/login/", admin_login, name="admin_login"), - path("studio-admin/logout/", admin_logout, name="admin_logout"), -] + path('', views.home, name='home'), + path('admin-login/', views.admin_login, name='admin_login'), + path('admin-logout/', views.admin_logout, name='admin_logout'), + path('assets/', views.asset_library, name='asset_library'), + path('studio-ai/', views.studio_ai, name='studio_ai'), + path('generate-production/', views.generate_production, name='generate_production'), + path('project//', views.project_detail, name='project_detail'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index e0f522a..76bcbb2 100644 --- a/core/views.py +++ b/core/views.py @@ -1,11 +1,12 @@ import os -import platform +import json from functools import wraps -from django import get_version as django_version from django.shortcuts import render, get_object_or_404, redirect from django.utils import timezone from django.contrib import messages -from .models import Project, PipelineStep, CgiAsset, StudioConfig +from django.http import JsonResponse +from .models import Project, PipelineStep, CgiAsset, StudioConfig, Scene +from ai.local_ai_api import LocalAIApi def studio_admin_required(view_func): """Decorator to restrict access to studio admin only.""" @@ -19,12 +20,11 @@ def studio_admin_required(view_func): def home(request): """Render the CGI Studio Command Center.""" - # Ensure StudioConfig exists and generate key if needed config, created = StudioConfig.objects.get_or_create(id=1) if created or not config.admin_access_key: - config.save() # Triggers uuid generation + config.save() - projects = Project.objects.prefetch_related('steps').all() + projects = Project.objects.prefetch_related('steps').all().order_by('-created_at') total_projects = projects.count() active_productions = projects.filter(status='PROD').count() @@ -40,6 +40,96 @@ def home(request): } return render(request, "core/index.html", context) +@studio_admin_required +def studio_ai(request): + """Page to configure and launch AI-automated productions.""" + return render(request, "core/studio_ai.html") + +@studio_admin_required +def generate_production(request): + """AI logic to create a full production automatically.""" + if request.method == "POST": + category = request.POST.get("category", "Sci-Fi") + proj_type = request.POST.get("project_type", "MOVIE") + theme = request.POST.get("theme", "Future of humanity") + + prompt = f""" + Create a detailed production plan for a {proj_type} in the {category} category. + Theme: {theme} + + Requirements: + 1. Unique Title and a compelling description. + 2. 3 Main Characters with names and detailed physical descriptions (based on REAL humans/actors style). + 3. 5 Key Scenes with titles and narrative descriptions. + + Return the result ONLY in JSON format with the following structure: + {{ + "title": "...", + "description": "...", + "characters": [ + {{"name": "...", "description": "...", "type": "CHAR"}} + ], + "scenes": [ + {{"title": "...", "description": "..."}} + ] + }} + """ + + response = LocalAIApi.create_response({ + "input": [ + {"role": "system", "content": "You are an expert Hollywood Producer and AI Cinema Director."}, + {"role": "user", "content": prompt}, + ], + "response_format": {"type": "json_object"}, + }) + + if response.get("success"): + try: + data = LocalAIApi.decode_json_from_response(response) + + # Create the Project + project = Project.objects.create( + title=data['title'], + project_type=proj_type, + category=category, + description=data['description'], + is_ai_generated=True, + status='PRE' + ) + + # Create default Pipeline Steps + stages = [s[0] for s in PipelineStep.STAGES] + for stage in stages: + PipelineStep.objects.create(project=project, name=stage, progress=0) + + # Create Characters (Assets) + for char in data['characters']: + CgiAsset.objects.create( + project=project, + name=char['name'], + asset_type='CHAR', + physical_description=char['description'] + ) + + # Create Scenes + for i, scene in enumerate(data['scenes']): + Scene.objects.create( + project=project, + number=i+1, + title=scene['title'], + description=scene['description'] + ) + + messages.success(request, f"Super Produção '{project.title}' criada com sucesso pelo Studio AI!") + return redirect('project_detail', slug=project.slug) + + except Exception as e: + messages.error(request, f"Erro ao processar resposta da AI: {str(e)}") + else: + messages.error(request, f"Erro na API de IA: {response.get('error')}") + + return redirect('studio_ai') + def admin_login(request): """View to enter the unique admin access key.""" if request.method == "POST": @@ -80,11 +170,12 @@ def asset_library(request): def project_detail(request, slug): """Render the detailed pipeline for a specific production.""" - project = get_object_or_404(Project.objects.prefetch_related('steps', 'assets'), slug=slug) + project = get_object_or_404(Project.objects.prefetch_related('steps', 'assets', 'scenes'), slug=slug) context = { "project": project, "steps": project.steps.all(), "assets": project.assets.all(), + "scenes": project.scenes.all(), } - return render(request, "core/project_detail.html", context) + return render(request, "core/project_detail.html", context) \ No newline at end of file