Arquivo para Python

Python – Montando um share no windows (SAMBA)

Posted in Django, Programação, Python, Tecnologia, Windows with tags , , , on 13 de setembro de 2013 by fchevitarese

Opa!

Como prometi (desta vez fui rápido), vou criar um post rapidão de como mapear uma unidade de rede autenticada com SAMBA no Windows, para que você possa gravar e ler arquivos =D

Primeiro eu criei a função abaixo:


#@TODO --> Pegar usuário, senha e host das confs do database =D
def mappDisk(drive, ip, sharedFolder, user, password):
 # print "Entrei aqui =D "
 import pywintypes
 import win32com.client

# Disconnect previous mapped drives
 networkPath = win32com.client.Dispatch('Wscript.Network')
 network_drives = networkPath.EnumNetworkDrives()
 for mapped_drive in [network_drives.Item(i)
 for i in range(0, network_drives.Count() -1 , 2)
 if network_drives.Item(i)]:
 networkPath.RemoveNetworkDrive(mapped_drive, True, True)

# Mount the drives
('z:', '\\\\192.168.1.100\\Some_Share', 'someuser', 'somepass')]
 drive_mapping = [
#(drive, '\\\\'+ip+'\\'+sharedFolder, user, password),
 ]
 print drive_mapping
 for drive_letter, network_path, user_name, user_pass in drive_mapping:
 try:
 networkPath.MapNetworkDrive(drive_letter, network_path, True, user_name, user_pass)
 return True
 except Exception, err:
 print err
 return False

Aí é só chamar a função passando os parâmetros, testar se você pode gravar o arquivo e ser feliz !!!


try:
 file= open(caminho.mapDrive + '\\' + caminho.pastaPedido + '\\' + fileName, 'a')
 except IOError:
 canWrite = mappDisk(caminho.mapDrive, caminho.ipServidor, caminho.sharedFolder, caminho.usuario, caminho.senha)

if canWrite:

 file= open(caminho.mapDrive + '\\' + caminho.pastaPedido + '\\' + fileName, 'a')

...

Como estou  usando o Django, criei um models para guardar os parâmetros. Assim fica mais fácil visualizar, editar e tals ^^

Segue no dpaste porque o último post ficou todo zicado –> http://dpaste.com/hold/1379145/

Obs.:  Usa a biblioteca pywin32 ….

Abraços!

Gravar arquivos em share do samba autenticado

Posted in Django, Programação, Python, Tecnologia, Windows with tags , , , on 13 de setembro de 2013 by fchevitarese

Opa!!

Bom, alguns meses ou anos que eu não posto nada!

Eu sempre posto experiências que tive para resolver determinadas coisas e tals, por isso não estava postando quase nada, pois a maioria das coisas que eu andava fazendo era digamos, trivial =D

Eis que esta semana, me deparo com uma situação no mínimo inusitada!
Estou migrando um sistema em ASP para Django, e como não dou conta de migrar tudo de uma vez, estou fazendo de forma gradual, o que me obriga a rodar o Django com uma velha versão do apache + chiliasp e wsgi =D

Servidor windows e tals… Enfim, minha aplicação precisa realizar uma troca de arquivos, no caso, em uma pasta de um samba server que roda uma outra aplicação que não é minha que tem a função de ler este arquivo, coletar as informações e me devolver um arquivo de resposta.
Eu leio este arquivo de resposta, pego as informações e devolvo para a página… Simples né! Até eu que sou mais bobo acreditei que seria!

O problema já começou na hora de gravar os arquivos. Como eu (inocentemente) mapeei a unidade/pasta do share, já autenticando e tals, pensei que seria simplesmente gravar no z:\pasta\ =D

Ledo engano! Nem chegava a encontrar o caminho =D

Parti então para o ataque e encontrei uma biblioteca chamada pysmb que resolveria meu problema!

Então vai seguir aí como foi que eu fiz! ^^
Obs.: Não vou ensinar aqui nada relacionado ao Django ou a instalação do pacote ^^

Primeiro os imports …


from smb.SMBConnection import SMBConnection
from nmb.NetBIOS import NetBIOS
from smb.smb_constants import *

Feito os imports, criei uma funçãozinha para fazer o trabalho =D


def getBIOSName(remote_smb_ip, timeout=30):
srv_name=""
try:
bios = NetBIOS()
srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
except:
print >> sys.stderr, "Looking up timeout, check remote_smb_ip again!!"
finally:
bios.close()
 # print srv_name
return srv_name

def connectShare():
server_name = getBIOSName('192.168.0.151')[0]
client_name = ('webdevelopervm')
s = SMBConnection('meu_usuario', 'minhasenha', client_name, server_name, use_ntlm_v2 = True)
s.connect(server_name, 139)
if s.auth_result:
# print s.listShares()
# print s.listPath('Publico','pedidos', SMB_FILE_ATTRIBUTE_ARCHIVE)

f = open(r"c:\meutestenovo.txt", 'a')
f.write("Funciona fedaputa!!!")
f.close()
f = open(r"c:\meutestenovo.txt", 'r')

s.storeFile('Publico', r'pedidos\\meutestenovo.txt', f)
f.close()

É necessário pegar o nome do servidor onde está o share, por isto a função getBiosName() =D
A variável client_name deve conter exatamente o nome do seu computador =D
Tive que criar o arquivo, depois ler o arquivo para enviar ao servidor.

Ainda não testei, mas deve existir uma maneira de criar o arquivo em memória e então envia-lo.

Tem outra forma de fazer mapeando o local, mas vou fazer outro post para dar mais moral no blog né XD

Segue o link no dpaste se caso não ficar legal os fontes aqui no blog –> SMBShare

Você também pode efetuar a conexão de outra maneira, usando smb://

Acredito que funcione até no windows mas eu não cheguei a testar 😉

http://miketeo.net/wp/index.php/2012/05/04/smb-url-support-in-pysmb.html

Link de onde encontrei a primeira luz (quase toda na verdade =D )

 

Abraços!

 

 

Extendendo User do Django

Posted in Django, Programação, Python, Tecnologia with tags , on 28 de junho de 2011 by fchevitarese

Opa!!!

Bom, resolvi criar o artigo ou post (sei lá) pois tenho acompanhado na lista diversas dúvidas à este respeito.
O cabra quer criar usuários utilizando o User que o próprio Django oferece, mas com alguns campos que são pertinentes a aplicação dele.

Na própria documentação do Django, tem uma explicação bacana de como se fazer:
http://docs.djangobrasil.org/topics/auth.html#armazenando-informa-es-adicionais-sobre-usu-rios

Outro artigo muito bom (inglês) é este aqui.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance

Eu implementei utilizando o artigo acima, só que ele apresenta um “problema”. Não sei se realmente é um bug do Django ou o que pode ser.
O fato é que mesmo ao se extender o Users do Django, quando você cria o novo usuário, a senha não é encriptada.
Perguntei na lista e fui aconselhado a sobrescrever o método save do User.
Não achei que fosse a melhor solução, mas no fim das contas, foi o que tive que fazer.

Como eu só utilizava a rotina de adição de usuários através do admin, ficou muito fácil de sobrescrever o método.
Eu criei uma classe padrão para o Admin dos meus usuários e todas as outras classes referentes extendiam dela 😉

Ficou assim:

class defaultAdminModel(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.set_password(obj.password)
        obj.save()

As outras classes ficaram assim:

class AdminLocaisAtendimento(defaultAdminModel):

Enfim, é isto 😛

Abraços!

Django Admin – Filtro com ForeignKey

Posted in Django, Programação, Python, Tecnologia with tags , on 22 de junho de 2011 by fchevitarese

Opa!

Não sei se o título foi claro, mas vou explicar o “problema” que tive e colocar o link da solução que eu encontrei no fantástico DjangoSnippets ^^
2 models relacionados e eu precisava filtrar no admin por um campo do model “pai” que não seu id ou instância.
( Acho que é isto xD )
Vamos exemplificar com códigos para ficar mais explicado ^^.

Model A:


class modelA(models.Model):
    descricao = models.CharField(max_length = 30)
    versao_dados = models.IntegerField(unique = True)
    arquivo = models.FileField(upload_to='tempfolder')

class modelB(models.Model):
    papai = models.ForeignKey(modelA) #Papai! kkkkk
    codigo = models.IntegerField()
    descricao = models.CharField(max_length = 100)
    class Meta:
        unique_together = (('rol', 'codigo'),)

Como você pode ver, se eu tentar cadastrar um modelA com a mesma versão já existente, o Django não deixará porque ele é único 😉

Já no modelB é um pouco diferente. Estou utilizando o unique_together, onde ele verificará como um registro único a união de papai e código, ou seja, eu poderei ter vários códigos repetidos, desde que cada um pertença a um papai diferente! xD ( Eu me acho engraçado às vezes kkk )
Este é o comportamento que eu preciso na minha aplicação 😉

Já no admin, eu precisava de um list_filter para o modelB que pudesse me mostrar a lista de versões cadastradas no modelA, e filtrar os dados do modelB de acordo com o que eu selecionar.
Ah tá!! Mas o Django não faz isto 😦 –> (Damn it!)  Bom, pelo menos não achei nada parecido 🙂

Então achei um snippet que faz workar! ^^

Aqui está o link da criança!
http://djangosnippets.org/snippets/2194/

No meu caso, eu coloquei o código dentro de uma pasta chamada utils, onde eu coloco algumas coisas que são peculiares a cada app.

O modelA ficou do mesmo jeito, já o modelB ficou assim:


class modelB(models.Model):
    papai = models.ForeignKey(modelA) #Papai! kkkkk
    papai.fk_filterspec = {'fk_field': 'versao_dados', }
    codigo = models.IntegerField()
    descricao = models.CharField(max_length = 100)
    class Meta:
        unique_together = (('rol', 'codigo'),)

Lembrando que é necessário importar o primeiro trecho que no meu caso, eu coloquei dentro de um arquivo que chamei de filterSpects, dentro da pasta utils da minha app.
Então ficou assim:

 from app.utils.filterSpecs import FkFilterSpec
 FkFilterSpec.register_filterspec()

Já no admin, ficou assim:

 list_filter = ('papai__versao_dados',)

Enfim, ficou bão !  ^^

Espero que seja útil pra mais alguém!!!

Abraços.objects.all()

Django + PostgreSQL + virtualenv Development setup for Windows 7

Posted in Django, Python, Tecnologia with tags , on 16 de junho de 2011 by fchevitarese

Opa!

Tive a necessidade de instalar um ambiente virtual na minha máquina de desenvolvimento com Windows 7 ( 😥 )  e encontrei um tutorial bacana para se deixar tudo funfando 😉

Segue o link para quem não encontrou uma solução bacana.

http://slacy.com/blog/2011/06/django-postgresql-virtualenv-development-setup-for-windows-7/

 

Abraços!

PythonBrasil[7] – Local e datas definidos ! ^^

Posted in Programação, Python, Tecnologia with tags , on 28 de abril de 2011 by fchevitarese

Salve salve!!
Vem aí a sétima edição do encontro brasileiro da comunidade Python, a  PythonBrasil!

Locais e datas já foram definidos. Para saber mais, acesse o site.

Ainda espero um dia em que o evento aconteça em Belo Horizonte! ^^

Abraços!!

easy_install + proxy

Posted in Python, Tecnologia with tags , , on 28 de fevereiro de 2011 by fchevitarese

Salve salve!!!

Hoje precisei utilizar o easy_install numa máquina Windows que estava utilizando proxy :S

Como esperado, não instalou nada… Aí, encontrei um link que fala o que fazer 😉

Você vai ter que adicionar uma nova variável de ambiente com o nome HTTP_PROXY que terá o seguinte valor:

“http://<proxyhost>:<port>”

Enfim, é muito simples….

Segue o link original 😉

http://demmer.ipax.at/blog/python-easy_install-behind-proxy-under-windows/