ALTER TABLE table_name ROW_FORMAT=DYNAMIC
Hasta!
ALTER TABLE table_name ROW_FORMAT=DYNAMIC
#from django.core.urlresolvers import reverse
from django.urls import reverse
defaults write "com.apple.Terminal" PreviousCommands '()'
Masonry is a JavaScript grid layout library. It works by placing elements in optimal position based on available vertical space, sort of like a mason fitting stones in a wall. You’ve probably seen it in use all over the Internet.
class PostListView(View):
def get(self, request, *args, **kwargs):
posts = Post.objects.all()
RPP = 18
PAGINA = 1
TOTAL = posts.count()
if request.GET.get('page'):
PAGINA = int(request.GET.get('page'))
page_template = 'blog/paginacao.html'
template = 'blog/list.html'
if request.is_ajax():
template = page_template
tem_mais = posts[PAGINA*RPP+1:]
tem_mais = tem_mais.count()
posts = posts[(PAGINA-1)*RPP:PAGINA*RPP]
if posts.count() == 0:
return HttpResponse('')
VARS = {
'posts':posts,
'pag':PAGINA,
'tem_mais': tem_mais,
'total': TOTAL,
}
return render(request, template, VARS)
{% extends "base.html" %}
{% block scripts %}
<script src="{% static "site/vendor/masonry/jquery.masonry.pkgd.min.js" %}" type="text/javascript"></script>
<script src="{% static "site/vendor/masonry/imagesloaded.pkgd.min.js" %}" type="text/javascript"></script>
<script src="{% static "site/src/js/layout.js" %}" type="text/javascript"></script>
<script src="{% static "site/src/js/blog.list.js" %}" type="text/javascript"></script>
{% endblock scripts %}
{% block conteudo %}
<!-- Masonry Grid -->
<div class="masonry-grid">
<div class="masonry-grid-sizer col-xs-6 col-sm-4 col-md-3 col-lg-2"></div>
{% for p in posts %}
<!-- Post Item -->
<div class="masonry-grid-item col-xs-6 col-sm-4 col-md-3 col-lg-2">
</div>
<!-- End Post Item -->
{% endfor %}
</div>
<!-- End Masonry Grid -->
<div class='loading-bg'>
<div class='loading'></div>
</div>
{% endblock conteudo %}
<!-- Masonry Grid -->
<div class="masonry-grid">
<div class="masonry-grid-sizer col-xs-6 col-sm-4 col-md-3 col-lg-2"></div>
{% for p in posts %}
<!-- Post Item -->
<div class="masonry-grid-item col-xs-6 col-sm-4 col-md-3 col-lg-2">
</div>
<!-- End Post Item -->
{% endfor %}
</div>
<!-- End Masonry Grid -->
<div class='loading-bg'>
<div class='loading'></div>
</div>
var Layout = function () {
'use strict';
var mobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
// handle on page scroll
var handleHeaderOnScroll = function() {
if ($(window).scrollTop() > 60) {
$('body').addClass('page-on-scroll');
} else {
$('body').removeClass('page-on-scroll');
}
}
// handle carousel
var handleCarousel = function() {
var $item = $('.carousel .item');
var $wHeight = $(window).height();
$item.eq(0).addClass('active');
$item.height($wHeight);
$item.addClass('full-screen');
$('.carousel img').each(function() {
var $src = $(this).attr('src');
var $color = $(this).attr('data-color');
$(this).parent().css({
'background-image' : 'url(' + $src + ')',
'background-color' : $color
});
$(this).remove();
});
$(window).on('resize', function (){
$wHeight = $(window).height();
$item.height($wHeight);
});
}
if($(window).width() > 992) {
$('.screen__height').height($(window).height()/1.3);
$(window).resize(function(){
$('.screen__height').height($(window).height()/1.3);
});
}
// handle group element heights
var handleHeight = function() {
$('[data-auto-height]').each(function() {
var parent = $(this);
var items = $('[data-height]', parent);
var height = 0;
var mode = parent.attr('data-mode');
var offset = parseInt(parent.attr('data-offset') ? parent.attr('data-offset') : 0);
items.each(function() {
if ($(this).attr('data-height') == "height") {
$(this).css('height', '');
} else {
$(this).css('min-height', '');
}
var height_ = (mode == 'base-height' ? $(this).outerHeight() : $(this).outerHeight(true));
if (height_ > height) {
height = height_;
}
});
height = height + offset;
items.each(function() {
if ($(this).attr('data-height') == "height") {
$(this).css('height', height);
} else {
$(this).css('min-height', height);
}
});
if(parent.attr('data-related')) {
$(parent.attr('data-related')).css('height', parent.height());
}
});
}
return {
init: function () {
handleHeaderOnScroll(); // initial setup for fixed header
handleCarousel(); // initial setup for carousel
handleHeight(); // initial setup for group element height
// handle minimized header on page scroll
$(window).scroll(function() {
handleHeaderOnScroll();
});
}
};
}();
$(document).ready(function() {
Layout.init();
});
jQuery(document).ready(function($) {
var carregando = false;
$(window).on('scroll', function(event) {
event.preventDefault();
/* Act on the event */
if($(window).scrollTop() + $(window).height() > $(document).height() - 100 && carregando == false && parseInt($('#tem_mais').val()) > 0) {
// console.log("near bottom!");
carregando = true
retrive_posts();
}
});
$('body').on('click', '.next', function(event) {
event.preventDefault();
carregando = true;
/* Act on the event */
retrive_posts();
});
function retrive_posts(){
var pag = parseInt($('#pag').val())+1;
$('.loading-bg').show();
$.get('?page='+pag, function(data) {
/*optional stuff to do after success */
// console.log(data);
// console.log(data == '');
// console.log($('#tem_mais').length);
console.log($('#tem_mais').val());
if(data){
$('#pag').val(parseInt(pag));
// console.log(data);
var aux = $('<div/>');
$(aux).html(data);
var tem_mais = $(aux).find('.tem_mais')[0];
$('#tem_mais').val($(tem_mais).val());
if (parseInt($('#tem_mais').val()) == 0) {
$('button.next').hide();
}
var $container = $('.masonry-grid');
$container.imagesLoaded( function() {
$container.masonry({
itemSelector: '.masonry-grid-item', // use a separate class for itemSelector, other than .col-
columnWidth: '.masonry-grid-sizer',
percentPosition: true,
transitionDuration: 0,
});
});
// console.log($(aux).find('.masonry-grid-item.appended'));
$(aux).find('.masonry-grid-item.appended').each(function(index, el) {
$(el).css({ opacity: 0 });
// console.log($(el));
$(el).imagesLoaded(function(){
// show elems now they're ready
$(el).css({ opacity: 1 });
$container.append( $(el) );
$container.masonry( 'appended', $(el), true );
$(el).removeClass('.appended')
});
});
carregando = false;
$('.loading-bg').hide();
}else{
$('button.next').hide();
}
});
}
});
@register.simple_tag
def git_ver():
'''
Retrieve and return the latest git commit hash ID and tag as a dict.
'''
import os, subprocess
from django.conf import settings
git_dir = os.path.dirname(settings.PROJECT_PATH)
try:
# Date and hash ID
head = subprocess.Popen(
"git --git-dir={dir}/.git rev-parse HEAD".format(dir=git_dir),
shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
version = head.stdout.readline().strip().decode('utf-8')
git_string = "{v}".format(v=version)
except:
git_string = u'unknown'
return git_string
{% load site_tags %}
<link href="styles.css?v={% git_ver %}" rel="stylesheet">
pip install -e git+https://github.com/mariocesar/sorl-thumbnail.git#egg=sorl-thumbnail
from django.utils.importlib import import_module ImportError: No module named importlib
from django.utils.importlib import import_module
from importlib import import_module
class Cadastro(models.Model): user = models.OneToOneField(User, null=True, blank=True) ... session_key = models.CharField(max_length=100, null=True) ...
...
from django.contrib.auth import authenticate, logout, login as authlogin
from django.contrib.sessions.backends.db import SessionStore
...
u = authenticate(username=email, password=senha)
if u is not None:
if u.is_active:
if u.cadastro.session_key: # check if user has session_key. This will be true for users logged in on another device
try:
s = SessionStore.objects.get(session_key=u.cadastro.session_key)
except Session.DoesNotExist:
pass
else:
s.delete() # delete the old session_key from db
# set new session_key for user instance
u.cadastro.session_key = request.session.session_key
u.cadastro.save() # save the user
u.save()
authlogin(request, u)
...
python manage.py startapp redes_sociais
from django.db import models
# Create your models here.
REDES_SOCIAIS_C = (
('FACEBOOK', 'Facebook'),
('TWITTER', 'Twitter'),
('INSTAGRAM', 'Instagram'),
)
class Post(models.Model):
"""(Post description)"""
texto = models.TextField()
imagem = models.ImageField(upload_to=U.retira_acento,null=True,blank=True,)
imagem_src = models.TextField(null=True,blank=True)
redesocial = models.CharField(max_length=255, choices=REDES_SOCIAIS_C)
pid = models.CharField(max_length=255)
data = models.DateTimeField(null=True, blank=True)
link = models.CharField(max_length=255, null=True, blank=True)
ativo = models.BooleanField(default=True)
class Meta:
verbose_name, verbose_name_plural = u"Post" , u"Posts"
ordering = ('-data',)
def __unicode__(self):
return u"%s" % self.texto
def get_imagem(self):
if self.imagem:
return self.imagem
elif self.imagem_src:
return self.imagem_src
return None
# coding: utf-8
from django.contrib import admin
from .models import *
class PostAdmin(admin.ModelAdmin):
search_fields = ('texto',)
list_display = ('texto', 'redesocial', 'pid','link' ,'data','ativo')
list_filter = ['redesocial','data','ativo']
list_editable = ['ativo',]
readonly_fields = ['texto', 'redesocial', 'pid','link' ,'data','imagem','imagem_src']
save_on_top = True
fieldsets = (
(u'Ativo', {'fields': ('ativo',)}),
(u'Infos', {'fields': ('redesocial', 'texto', 'pid', 'link')}),
(u'Data', {'fields': ('data',)}),
(u'Imagem', {'fields': ('imagem','imagem_src')}),
)
admin.site.register(Post, PostAdmin)
# INSTAGRAM INSTAGRAM_USER_ID = '[USER_ID DO FEED]' INSTAGRAM_CLIENT_ID = '[CLIENT_ID DO PASSO 2]' INSTAGRAM_CLIENT_SECRET = '[CLIENT_SECRET DO PASSO 2]' INSTAGRAM_ACCESS_TOKEN = '[TOKEN OBTIDO NO PASSO 5.1]'
pip install python-instagram==1.3.2
#!/usr/bin/env python
# coding: utf-8
from os.path import abspath, dirname
from datetime import datetime, date, timedelta
import sys, os, commands, time
SETTINGS_DIRECTORY = dirname(dirname(abspath(__file__)))
sys.path.insert(0, SETTINGS_DIRECTORY)
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
from django.db.models import Count, Min, Sum, Avg
from django.template.defaultfilters import slugify
import re, json
def log(texto):
print "===================================="
print texto
print "===================================="
def carga():
log("INICIO DA ROTINA")
from redes_sociais.models import Post
from instagram.client import InstagramAPI
# AUTH REQUIRED
access_token = settings.INSTAGRAM_ACCESS_TOKEN
client_secret = settings.INSTAGRAM_CLIENT_SECRET
api = InstagramAPI(access_token=access_token, client_secret=client_secret)
recent_media, next_ = api.user_recent_media(user_id=settings.INSTAGRAM_USER_ID, count=10)
for media in recent_media:
#print dir(media)
#print media.caption.text
post = Post.objects.filter(pid=media.id)
texto = media.caption.text if media.caption else None
try:
if post:
post = post[0]
post.texto = u'{0}'.format(texto)
post.data = media.created_time
post.imagem = media.get_standard_resolution_url()
else:
post = Post(
redesocial = 'INSTAGRAM',
pid = media.id,
texto = u'{0}'.format(texto),
data = media.created_time,
link = media.link,
imagem = media.get_standard_resolution_url(),
)
post.save()
except Exception, e:
log(u"Erro ao inserir [{0}]: {1}".format(media.id, media.get_standard_resolution_url()))
log(e)
# AUTH NON REQUIRED
# api = InstagramAPI(client_id=settings.INSTAGRAM_CLIENT_ID, client_secret=settings.INSTAGRAM_CLIENT_SECRET)
# popular_media = api.media_popular(count=20)
# for media in popular_media:
# print media.images['standard_resolution'].url
log("FIM DA ROTINA")
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
carga()
# TWITTER TWITTER_USERNAME = 'zejuniortdr' TWITTER_CONSUMER_KEY = '0aYPbXNNNYvhGyPg9CYufUncN' TWITTER_CONSUMER_SECRET = 'Lf6MfaSRp3qQaAGlbrVyt0hyo3659obj5bL2W6tiO8PWEAE0vU' TWITTER_ACCESS_TOKEN = '30026596-WKqQtcC3AmboRBOqp9uE1cEPfJkZIfeNB8mdR1nVK' TWITTER_ACCESS_SECRET = '9j7D0yzgvIybg6vnB9iqac1354Shv21YE2OwSO1oUarTw'
pip install tweepy==3.3.0
#!/usr/bin/env python
# coding: utf-8
from os.path import abspath, dirname
from datetime import datetime, date, timedelta
import sys, os, commands, time
SETTINGS_DIRECTORY = dirname(dirname(abspath(__file__)))
sys.path.insert(0, SETTINGS_DIRECTORY)
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
import re
def log(texto):
print "===================================="
print texto
print "===================================="
def carga():
log("INICIO DA ROTINA")
from redes_sociais.models import Post
import tweepy
from tweepy import OAuthHandler
consumer_key = settings.TWITTER_CONSUMER_KEY
consumer_secret = settings.TWITTER_CONSUMER_SECRET
access_token = settings.TWITTER_ACCESS_TOKEN
access_secret = settings.TWITTER_ACCESS_SECRET
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
username = settings.TWITTER_USERNAME
user = tweepy.API(auth).get_user(username)
# log(dir(user))
status = api.user_timeline(screen_name=username, count=200, include_entities=True)
for s in status:
imagem = None
if 'media' in s.entities.keys():
imagem = s.entities['media'][0]['media_url']
post = Post.objects.filter(pid=s.id)
try:
if post:
post = post[0]
post.texto = u'{0}'.format(s.text)
post.data = s.created_at
post.imagem = imagem
else:
post = Post(
redesocial = 'TWITTER',
pid = s.id,
texto = u'{0}'.format(s.text),
data = s.created_at,
link = 'https://twitter.com/{0}/status/{1}'.format(username, s.id),
imagem = imagem,
)
post.save()
except Exception, e:
log(u"Erro ao inserir [{0}]: {1}".format(status.id, status.text))
log("FIM DA ROTINA")
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
carga()
# FACEBOOK FACEBOOK_PAGE_ID = [ID DA PAGINA QUE QUER O FEED DE POSTAGENS] # must be integer FACEBOOK_APP_ID = [ID DA APLICACAO CRIADA] # must be integer FACEBOOK_APP_SECRET = "[APP SECRET DA APLICACAO CRIADA]"
facebook-sdk==2.0.0 facepy==1.0.8
#!/usr/bin/env python
# coding: utf-8
from os.path import abspath, dirname
from datetime import datetime, date, timedelta
import sys, os, commands, time
SETTINGS_DIRECTORY = dirname(dirname(abspath(__file__)))
sys.path.insert(0, SETTINGS_DIRECTORY)
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
from django.db.models import Count, Min, Sum, Avg
from django.template.defaultfilters import slugify
import re, json
def log(texto):
print "===================================="
print texto
print "===================================="
def carga():
log("INICIO DA ROTINA")
from redes_sociais.models import Post
from facepy import utils, GraphAPI
import facebook
app_id = settings.FACEBOOK_APP_ID
page_id = settings.FACEBOOK_PAGE_ID
app_secret = settings.FACEBOOK_APP_SECRET
oath_access_token = utils.get_application_access_token(app_id, app_secret)
a = GraphAPI(oath_access_token)
response = a.get('{0}/posts?fields=id,picture,message,link,full_picture,created_time,object_id'.format(page_id))
for r in response['data']:
post_id = None
post_message = None
post_link = None
post_full_picture = None
post_created_time = None
for k, v in r.items():
if k == 'id':
post_id = v
elif k == 'message':
post_message = v
elif k == 'link':
post_link = v
elif k == 'full_picture':
post_full_picture = v
elif k == 'created_time':
post_created_time = v
post = Post.objects.filter(pid=post_id)
try:
if post:
post = post[0]
post.texto = u'{0}'.format(post_message)
post.pid = u'{0}'.format(post_id)
post.data = post_created_time
post.imagem_src = post_full_picture
post.link = u'{0}'.format(post_link)
else:
post = Post(
texto = u'{0}'.format(post_message),
redesocial = 'FACEBOOK',
pid = u'{0}'.format(post_id),
imagem_src = post_full_picture,
data = post_created_time,
link = u'{0}'.format(post_link),
)
post.save()
except Exception, e:
log(u"Erro ao inserir [{0}]: {1} - {2}".format(post_id, post_message, e))
log("FIM DA ROTINA")
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
carga()
python app/feed_instagram.py python app/feed_twitter.py python app/feed_facebook.py
class SeuModelForm(forms.ModelForm):
campo1 = forms.CharField(required=False, widget=forms.TextInput(),)
campo1a = forms.BooleanField(required=False, widget=forms.CheckboxInput(),)
campo2 = forms.CharField(required=False, widget=forms.TextInput(),)
campo2a = forms.BooleanField(required=False, widget=forms.CheckboxInput(),)
campo3 = forms.BooleanField(required=False, widget=forms.CheckboxInput(),)
class Meta:
model = SeuModel
fields = '__all__'
#def clean_aceito(self):
# campo3 = self.cleaned_data['campo3']
# if not campo3:
# raise forms.ValidationError("Mensagem de erro do campo3")
# return campo3
def clean(self):
cleaned_data = super(SeuModelForm, self).clean()
campo1 = cleaned_data.get("campo1")
campo1a = cleaned_data.get("campo1a")
campo2 = cleaned_data.get("campo2")
campo2a = cleaned_data.get("campo2a")
campo3 = cleaned_data['campo3']
if not campo1 and not campo1a:
self.add_error('campo1', u'Mensagem de erro do campo1')
if not campo2 and not campo2a:
self.add_error('campo2', u'Mensagem de erro do campo2')
if not campo3:
self.add_error('campo3', u'Mensagem de erro do campo3')
Traceback (most recent call last): File " in="" line="" manage.py="" module=""> execute_from_command_line(sys.argv) File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/django/core/management/__init__.py",
line 353, in execute_from_command_line
utility.execute()
File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/django/core/management/__init__.py",
line 327, in execute
django.setup()
File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/django/apps/config.py",
line 202, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/var/www/SEU_SITE/app/blog/models.py", line 11, in
from ckeditor.fields import RichTextField
File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/ckeditor/fields.py", line 4, in
from ckeditor.widgets import CKEditorWidget
File "/var/www/SEU_SITE/ENV/local/lib/python2.7/site-packages/ckeditor/widgets.py", line 10, in
from django.forms.util import flatatt
ImportError: No module named util
django.forms.util import flatatt
django.forms.utils import flatatt
pip install django-image-cropping
pip install easy_thumbnails
INSTALLED_APPS = [
...
'easy_thumbnails',
'image_cropping',
...
]
from easy_thumbnails.conf import Settings as thumbnail_settings
THUMBNAIL_PROCESSORS = (
'image_cropping.thumbnail_processors.crop_corners',
) + thumbnail_settings.THUMBNAIL_PROCESSORS
from image_cropping import ImageRatioField
class SeuModel(models.Model):
...
imagem = models.ImageField(upload_to="/caminho/para/upload/",)
cropping = ImageRatioField('imagem', '900x900')
...
from django.contrib import admin
from image_cropping import ImageCroppingMixin
class SeuModelAdmin(ImageCroppingMixin, admin.ModelAdmin):
pass
admin.site.register(SeuModel, SeuModelAdmin)
{% cropped_thumbnail instancia_do_seu_model "cropping" [scale=INT|width=INT|height=INT|max_size="INTxINT"] %}
<img cropping="" scale="0.5" src="{% cropped_thumbnail instancia_do_seu_model " />
from image_cropping import ImageCroppingMixin class ImagemInline(ImageCroppingMixin, admin.TabularInline): model = Imagem extra = 0
class CadastroAdmin(admin.ModelAdmin):
form = CadastroForm
search_fields = ('nome',)
list_display = ('nome', 'email', 'unidade','ativo',)
list_filter = ['ativo','unidade']
list_editable = ['ativo',]
exclude = ('user',)
save_on_top = True
def get_queryset(self, request):
qs = super(CadastroAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.exclude(id__in=[13,14,15])
admin.site.register(Cadastro, CadastroAdmin)


... url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog'), ...
<script type="text/javascript" src="/jsi18n/" > </script>
class SuaClasseCreateView(CreateView):
form_class = SuaClasseForm
success_url = '/url-de-sucesso/'
template_name = 'form.html'
model = SuaClasse
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
if request.POST.get('_addanother'):
self.success_url = '/url-de-nova-insercao/'
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.save()
return HttpResponseRedirect(self.success_url)
def form_invalid(self, form):
return self.render_to_response(
self.get_context_data(form=form)
)
class SuaClasseUpdateView(UpdateView):
form_class = SuaClasseForm
model = SuaClasse
success_url = '/url-de-sucesso/'
template_name = 'form.html'
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
form.instance = self.object
if form.is_valid():
if request.POST.get('_addanother'):
self.success_url = '/url-de-nova-insercao/'
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.save()
return HttpResponseRedirect(self.success_url)
def form_invalid(self, form):
return self.render_to_response(
self.get_context_data(form=form)
)
<input type="submit" name="_addanother" value="Salvar e adicionar outro(a)">
pip install django-geoposition
INSTALLED_APPS = (
...
'geoposition',
...
)
GEOPOSITION_MAP_OPTIONS = {
'minZoom': 15,
'maxZoom': 18,
}
from geoposition.fields import GeopositionField
from localflavor.br.br_states import STATE_CHOICES
class SuaClasse(models.Model):
"""(Unidade description)"""
endereco = models.CharField(max_length=255, verbose_name=u'Endereço', help_text='Para uma melhor localização no mapa, preencha sem abreviações. Ex: Rua Martinho Estrela, 1229')
bairro = models.CharField(max_length=255,)
cidade = models.CharField(max_length=255,help_text="Para uma melhor localização no mapa, preencha sem abreviações. Ex: Belo Horizonte")
estado = models.CharField(max_length=2, null=True, blank=True,choices=U.STATE_CHOICES)
position = GeopositionField(verbose_name=u'Geolocalização', help_text="Não altere os valores calculados automaticamente de latitude e longitude")
class Meta:
verbose_name, verbose_name_plural = u"Sua Classe" , u"Suas Classes"
ordering = ('endereco',)
def __unicode__(self):
return u"%s" % self.endereco
# coding: utf-8
from django import forms
from django.contrib import admin
from .models import *
class SuaClasseForm(forms.ModelForm):
class Media:
css = {
'all': ('admin/css/geoposition_override.css',)
}
js = ('admin/js/geoposition_override.js',)
class SuaClasseAdmin(admin.ModelAdmin):
form = SuaClasseForm
search_fields = ('endereco', 'cidade',)
list_display = ('endereco', 'cidade','estado','bairro')
list_filter = ['estado',]
save_on_top = True
admin.site.register(SuaClasse, SuaClasseAdmin)
.geoposition-search input{display:none;}
django.jQuery(document).ready(function($) {
$('#id_position_0, #id_position_1').attr('readonly', 'readonly');
$('#id_endereco, #id_cidade, #id_estado').blur(function(event) {
/* Act on the event */
if ($('#id_endereco').val()!='' && $('#id_cidade').val()!='' && $('#id_estado').val()!='') {
$('.geoposition-search input').val($('#id_endereco').val()+' ' +$('#id_cidade').val()+' '+$('#id_estado').val());
// TRIGGER DO ENTER PARA EXECUTAR A BUSCA
var e = $.Event("keydown");
e.which = 50; // # Some key code value
$(".geoposition-search input").trigger(e);
};
});
});
# coding: utf-8
from django import forms
from .models import Contato
class ContatoForm(forms.ModelForm):
nome = forms.CharField(widget=forms.TextInput(attrs={'class' : 'required',}), label="Nome")
email = forms.EmailField(widget=forms.TextInput(attrs={'class' : 'required',}), label="E-mail")
texto = forms.CharField(widget=forms.Textarea(attrs={'class' : 'required',}), label="Texto")
class Meta:
model = Contato
fields = '__all__'
def dados(self):
return {'form':self.cleaned_data, 'data':datetime.now()}
# Create your views here.
# coding: utf-8
from django.views.generic.edit import CreateView
from .forms import ContatoForm
from .models import Contato
class ContatoView(CreateView):
form_class = ContatoForm
success_url = '/contato/sucesso/'
template_name = 'contato/contato.html'
model = Contato
def get_context_data(self, **kwargs):
kwargs.update({
'menu':'contato',
'title': 'Contato',
})
return kwargs
<form method="post" action="">
{% csrf_token %}
{{ form.errors}}
{{ form.as_p }}
<input class="btn" type="submit" value="Enviar">
</form>
<p>{{ form.email }}</p>
<div class="error">{{ form.email.errors }}</div>
class ContatoUpdateView(UpdateView):
form_class = ContatoForm
model = Contato
success_url = '/contato/sucesso/'
template_name = 'contato/contato.html'
def get_context_data(self, **kwargs):
kwargs.update({
'menu':'contato',
'title': 'Contato',
'update':True,
})
return kwargs
# coding: utf-8
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.forms.models import inlineformset_factory
from django import forms
from .models import *
from util import util as U
class ModeloForm(forms.ModelForm):
class Meta:
model = Modelo
fields = '__all__'
def dados(self):
return {'form':self.cleaned_data, 'data':datetime.now()}
class ModeloInline1Form(forms.ModelForm):
class Meta:
model = ModeloInline1
fields = '__all__'
ModeloInline1FormSet = inlineformset_factory(Modelo, ModeloInline1, extra=0, min_num=1, form=ModeloInline1Form, fields='__all__')
class ModeloInline2Form(forms.ModelForm):
class Meta:
model = ModeloInline1
fields = '__all__'
ModeloInline2FormSet = inlineformset_factory(Modelo, ModeloInline2, extra=0, min_num=1, form=ModeloInline1Form, fields='__all__')
class ModeloCreateView(CreateView):
form_class = ModeloForm
success_url = '/home/'
template_name = 'modelo/form.html'
model = Modelo
def get(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
inline1_form = ModeloInline1FormSet()
inline2_form = ModeloInline2FormSet()
return self.render_to_response(self.get_context_data(form=form, inline1_form = inline1_form , inline2_form = inline2_form ))
def post(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
inline1_form = ModeloInline1FormSet(self.request.POST)
inline2_form = ModeloInline1FormSet(self.request.POST)
if (form.is_valid() and inline1_form .is_valid() and
inline2_form .is_valid()):
return self.form_valid(form, inline1_form , inline2_form )
else:
return self.form_invalid(form, inline1_form , inline2_form )
def form_valid(self, form, inline1_form, inline2_form ):
self.object = form.save()
inline1_form.instance = self.object
inline1_form.save()
inline2_form.instance = self.object
inline2_form.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, inline1_form, inline2_form ):
return self.render_to_response(
self.get_context_data(
form=form,
inline1_form=inline1_form,
inline2_form=inline2_form)
)
def get_context_data(self, **kwargs):
kwargs.update({})
return kwargs
class ModeloUpdateView(UpdateView):
form_class = ModeloForm
model = Modelo
success_url = '/home/'
template_name = 'modelo/form.html'
def get(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
# Render form
inline1_form = ModeloInline1FormSet(instance=self.object)
inline2_form = ModeloInline2FormSet(instance=self.object)
return self.render_to_response(self.get_context_data(form=form,inline1_form=inline1_form,inline2_form=inline2_form))
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form_class = self.get_form_class()
form = self.get_form(form_class)
inline1_form = ModeloInline1FormSet(self.request.POST, instance=self.object)
inline2_form = ModeloInline2FormSet(self.request.POST, instance=self.object)
if (form.is_valid() and inline1_form.is_valid() and inline2_form.is_valid()):
return self.form_valid(form, inline1_form, inline2_form)
else:
return self.form_invalid(form, inline1_form, inline2_form)
def form_valid(self, form, inline1_form , inline2_form ):
self.object = form.save()
inline1_form.instance = self.object
inline1_form.save()
inline2_form.instance = self.object
inline2_form.save()
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form, inline1_form , inline2_form ):
return self.render_to_response(
self.get_context_data(
form=form,
inline1_form=inline1_form,
inline2_form=inline2_form)
)
def get_context_data(self, **kwargs):
kwargs.update({
'update':True,
})
return kwargs
<script type="text/javascript" src="/static/site/js/plugins/underscore/underscore-min.js"></script>
<script type="text/html" id="modeloinline1-template">
<div class="bloco-modeloinline1 clearfix">
<div class="col-lg-12">
<div class="form-group">
<label for="">Exemplo de Textarea</label>
<textarea rows="5" name="modeloinline1_set-<%= id %>-descricao" id="id_modeloinline1_set-<%= id %>-descricao" cols="40" class="form-control"></textarea>
</div>
</div>
</div>
</script>
django.jQuery('.container-modeloinline1').on('click', '.btn-adicionar-modeloinline1', function(ev) {
ev.preventDefault();
django.jQuery(this).parent().find('button').hide();
var count = django.jQuery('.container-modeloinline1').children().length;
var tmplMarkup = django.jQuery('#modeloinline1-template').html();
var compiledTmpl = _.template(tmplMarkup, { id : count });
django.jQuery('.modeloinline1-form"').append(compiledTmpl);
// update form count
django.jQuery('#id_modeloinline1_set-TOTAL_FORMS').attr('value', count+1);
});
</script>
<form role="form" action="" method="post" class=''>
{{ modeloinline1.management_form }}
<div class="container-modeloinline1-form">
{% for form in inline1_form %}
{% if update %}
{{ form.id }}
{{ form.avaliacao }}
{% endif %}
{% if form.errors %}
<div class="alert alert-danger">
Por favor corriga os erros abaixo para prosseguir:
{{ form.errors}}
</div>
{% endif %}
</div>
</form>
<button class="btn btn-primary btn-sm btn-adicionar-modeloinline1" type="button">Adicionar outro Modeloinline1</button>
{% load static from staticfiles %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="/static/admin/css/widgets.css">
</head>
<body>
<form action="" method="post">
<!-- Não esqueca de colcoar o atributo multiple="multiple" -->
<select name="seu_campo" id="id_seu_campo" multiple="multiple">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
<input type="submit">
</form>
<script src="{% static "site/js/jquery.js" %}"></script>
<script type="text/javascript" src="{% static "admin/js/jquery.init.js" %}"></script>
<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="{% static "admin/js/core.js" %}"></script>
<script type="text/javascript" src="{% static "admin/js/SelectBox.js" %}"></script>
<script type="text/javascript" src="{% static "admin/js/SelectFilter2.js" %}"></script>
<script type="text/javascript">
// PARAMETROS DO SELECT FILTER:
// ID do seu elemento select
// NAME do seu elemento select
// 0 - para filter_horizontal / 1 para filter_vertical
// Caminho do admin para source de imagens utilizadas
addEvent(window, "load", function(e) {SelectFilter.init("id_seu_campo", "seu_campo", 0, "/static/admin/"); });
</script>
</body>
</html>
hasta!
pip install django-auditlog
... 'auditlog' ...
manage.py migrate
... 'auditlog.middleware.AuditlogMiddleware' ...
from auditlog.registry import auditlog
from django.db import models
class MyModel(models.Model):
pass
# Model definition goes here
auditlog.register(MyModel)
# coding: utf-8
from django.db import models
# Create your models here.
class IP(models.Model):
"""(IP description)"""
ip = models.GenericIPAddressField()
descricao = models.CharField(max_length=255, null=True, blank=True,verbose_name=u'Descrição')
data = models.DateTimeField(auto_now=True)
class Meta:
verbose_name, verbose_name_plural = u"IP" , u"IPs"
ordering = ('-data',)
def __unicode__(self):
return u"%s" % self.ip
# coding: utf-8
from django.contrib import admin
from .models import *
class IPAdmin(admin.ModelAdmin):
search_fields = ('ip', 'descricao',)
list_display = ('ip', 'descricao','data',)
list_filter = ['data',]
save_on_top = True
admin.site.register(IP, IPAdmin)
... 'permissoes', ...
# coding: utf-8
from django.conf import settings
from django.http import HttpResponseRedirect
from permissoes.models import IP
class NeedToLoginMiddleware(object):
def process_request(self, request):
# pega o IP do usuário
ip = request.META['REMOTE_ADDR']
# verifica se o ip consta na base de ips permitidos
ip_permitido = IP.objects.filter(ip=ip).count()
# lista de urls que não serão validadas
ALLOWED_URLS = [
'%s' % settings.LOGIN_URL,
'/admin/',
]
for a in ALLOWED_URLS:
try:
if request.META['PATH_INFO'].find(a) >= 0:
return None
except:
pass
# verifica se o ip está permitido
if ip_permitido:
return None
else:
# se o ip não estiver permitido, verifica se o usuário está autenticado
# e redireciona para url de login em caso negativo.
if not request.user.is_authenticated(): #if ip check failed, make authentication check
return HttpResponseRedirect(settings.LOGIN_URL)
return None
MIDDLEWARE_CLASSES = (
...
'app.middleware.NeedToLoginMiddleware',
)