Commits

Francisco Souza  committed 7bf4ca4

Conclusão da aplicação "projetos", já em produção:
http://franciscosouza.net/projetos/

  • Participants
  • Parent commits b6417d8

Comments (0)

Files changed (13)

 - url: /aprendacompy
   static_dir: aprendacompy
 
+- url: /Imagem
+  script: chico.py
+
 - url: /.*
   script: common/appenginepatch/main.py
-#coding:utf-8
-import logging, os, sys
+from google.appengine.ext import webapp
+from util.handler import ImagemDoProjetoHandler
+from google.appengine.ext.webapp.util import run_wsgi_app
 
-# Google App Engine imports.
-from google.appengine.ext.webapp import util
-
-#Removendo o Django inútil
-for k in [k for k in sys.modules if k.startswith('django')]:
-    del sys.modules[k]
-    
-#Usando meu Django
-sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
-
-# Must set this env var *before* importing any part of Django
-os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
-
-import django.core.handlers.wsgi
-import django.core.signals
-import django.db
-
-def log_exception(*args, **kwds):
-    logging.exception('Exception in request:')
-
-# Log errors.
-#django.dispatch.dispatcher.connect(
-#    log_exception, django.core.signals.got_request_exception)
-
-# Unregister the rollback event handler.
-#django.dispatch.dispatcher.disconnect(
-#    django.db._rollback_on_exception,
-#    django.core.signals.got_request_exception)
+application = webapp.WSGIApplication([
+    ('/Imagem', ImagemDoProjetoHandler),
+], debug=True)
 
 def main():
-    # Create a Django application for WSGI.
-    application = django.core.handlers.wsgi.WSGIHandler()
-
-    # Run the WSGI CGI handler with that application.
-    util.run_wsgi_app(application)
+    run_wsgi_app(application)
 
 if __name__ == '__main__':
-    main()
+    main()

File projetos/forms.py

 from django import forms
 from django.template.defaultfilters import slugify
-from google.appengine.ext import db
 
 from models import Projeto
 
     
     def save(self, commit = True):
         projeto = super(ProjetoForm, self).save(commit = False)
-        
         if not projeto.slug:
-            slug = slugify(projeto.titulo)
+            slug = str(slugify(projeto.titulo))
             novo_slug = slug
             contador = 0
             
-            print Projeto.all()
-            
-            q = db.GqlQuery('SELECT * FROM Projeto WHERE slug = :1 AND id != :2', novo_slug, projeto.id)
+            q = Projeto.all().filter("slug = ", novo_slug)
             
             while q.count() > 0:
                 contador += 1
                 novo_slug = '%s-%d' %(slug, contador)
-                q = db.GqlQuery('SELECT * FROM Projeto WHERE slug = :1 AND id != :2', novo_slug, projeto.id)
+                q = Projeto.all().filter("slug = ", novo_slug)
             
             projeto.slug = novo_slug
             
         if commit:
-            projeto.save()
+            projeto.put()
         
         return projeto

File projetos/models.py

 #coding:utf-8
 from google.appengine.ext import db
 from django.core.urlresolvers import reverse
-from django.template.defaultfilters import slugify
 
 class Projeto(db.Model):
+    class Meta:
+        ordering = ('titulo',)
+        
     titulo = db.StringProperty(required=True)
     descricao = db.StringProperty(required=True, multiline=True)
     src_url = db.StringProperty('Código fonte na web', required=False)
     web_url = db.StringProperty('Endereço na web', required=False)
     imagem = db.BlobProperty('Imagem do projeto', required=False)
+    tipo_imagem = db.StringProperty(required=False)
     slug = db.StringProperty(required=False)
     
     def get_url(self):
-        return reverse('projetos.views.projeto', kwargs = {'slug' : self.slug })
-    
-def projeto_pre_save(signal, instance, sender, **kwargs):
-    if not instance.slug:
-        slug = slugify(instance.titulo)
-        novo_slug = slug
-        contador = 0
-        
-        while Projeto.all().filter(slug=novo_slug).exclude(id=instance.id).count() > 0:
-            contador += 1
-            novo_slug = '%s-%d' %(slug, contador)
-            
-        instance.slug = novo_slug
+        return reverse('projetos.views.projeto', kwargs = {'slug' : self.slug })

File projetos/templates/projetos/detalhes_projeto.html

+{% extends "blog_model.html" %}
+
+{% block "titulo" %}{{ block.super }} | Projeto {{ projeto.titulo }}{% endblock "titulo" %}
+
+{% block "conteudo" %}
+    <div class="post" id="post">
+        <h2 class="title">{{ projeto.titulo }}</h2>
+        <div class="entry">
+            <p>
+                {% if projeto.imagem %}
+                    <img src="/Imagem?projeto={{ projeto.slug }}" align="right" />
+                {% endif %}
+                {{ projeto.descricao|safe|linebreaks }}
+                <br /><br />
+                {% if projeto.web_url %}
+                    <strong>Website do projeto:</strong> <a href="{{ projeto.web_url }}" target="_blank">{{ projeto.web_url }}</a><br />
+                {% endif %}
+                {% if projeto.src_url %}
+                    <strong>URL de acesso ao código fonte:</strong> <a href="{{ projeto.src_url }}" target="_blank">{{ projeto.src_url }}</a><br />
+                {% endif %} 
+            </p>
+        </div>
+    </div>
+{% endblock "conteudo" %}

File projetos/views.py

+#coding:utf-8
 # Create your views here.
 from django.shortcuts import render_to_response
 from django.template import RequestContext
+from django.http import Http404
+
 from models import Projeto
 
 def lista(request):
     return render_to_response('projetos/lista_projetos.html', locals(), RequestContext(request))
 
 def projeto(request, slug):
-    projetos = Projeto.all()
-    return render_to_response('projetos/lista_projetos.html', locals(), RequestContext(request))
+    projeto = Projeto.all().filter("slug = ", slug)
+    if projeto.count() > 1:
+        projetos = Projeto.all()
+        msg = 'Há um erro com este slug, ele não é único, entre em contato por favor para notificar este problema.'
+        return render_to_response('projetos/lista_projetos.html', locals(), RequestContext(request))
+    elif projeto.count() < 1:
+        raise Http404
+    else:
+        projeto = projeto.fetch(1)[0]
+        return render_to_response('projetos/detalhes_projeto.html', locals(), RequestContext(request))

File static/novo/style.css

     margin: auto;
     padding-bottom: 1em;
 }
+
+.form_contato table {
+    margin-top: 1em;
+}

File templates/bemvindo.html

 {% block "titulo" %}{{ block.super }} | Bem-vindo!{% endblock "titulo" %}
 
 {% block "conteudo" %}
-	{% if msg %}
-		<div class="aviso">{{ msg }}</div>
-	{% endif %}
-
-    <div class="post" id="post">
+	<div class="post" id="post">
     	<h2 class="title">Bem-vindo</h2>
     	<div class="entry">
     		Seja bem-vindo. Eu simplesmente não sei o que colocar na página inicial (:<br /><br />

File templates/blog_model.html

 <div id="page">
 <!-- Content -->
 <div id="content">
+    {% if msg %}
+        <div class="aviso">{{ msg }}</div>
+    {% endif %}
 	{% block "conteudo" %}
 	{% endblock "conteudo" %}
 </div>
     (r'^contato/', 'views.contato'),
     (r'^projetos/', include('projetos.urls')),
     #(r'criar_admin/', 'views.criar_admin'),
+    #(r'criar_projeto/', 'views.criar_projeto'),
 )

File util/__init__.py

Empty file added.

File util/handler.py

+from google.appengine.ext import webapp
+from projetos.models import Projeto
+
+class ImagemDoProjetoHandler(webapp.RequestHandler):
+    
+    def get(self):
+        query_projeto = Projeto.all().filter("slug =", self.request.get('projeto'))
+        if 0 < query_projeto.count() < 2 and query_projeto.fetch(1)[0].imagem:
+            self.response.headers['Content-Type'] = 'image/png'
+            self.response.out.write(query_projeto.fetch(1)[0].imagem)
+        else:
+            self.response.out.write(query_projeto.count())
 from django.contrib.auth.models import User
 from django import forms
 from google.appengine.api.mail import send_mail
+from projetos.models import Projeto
 
 class FormContato(forms.forms.Form):
     name = forms.fields.CharField(max_length=100)