2013-02-20 8 views
0

나는 단일 데이터베이스 테이블에서 정보를 가져와 사용자에게 주간 업데이트 전자 메일을 보내는 python 스크립트를 가지고 있습니다. 구조를 정규화하고 모든 수사관 정보 (접두어, fname, lname 및 전자 메일)를 자체 테이블에 넣을 수 있도록 코드를 수정하는 방법을 찾고 싶습니다. 그러나 필자는 엘릭시어 모델과 파이썬 코드의 구조 내에서이를 어떻게 수행해야할지 모르겠다. 여기 python과 elixir를 사용하여 외래 키가있는 db 테이블을 사용하는 전자 메일 보내기

내 현재의 비약 모델 파일입니다

from elixir import * 
import auth as auth 
au = auth.UserAuth() 

metadata.bind = 'mysql://' + au.user + ':' + au.password + '@localhost/' + au.database 
metadata.bind.echo = True 


class Protocol(Entity): 
    id = Field(Integer, primary_key = True) 
    irb_no = Field(Text) 
    title = Field(Text) 
    prefix = Field(Text) 
    fname = Field(Text) 
    lname = Field(Text) 
    email = Field(Text) 
    action_date = Field(Date) 
    action = Field(Text) 
    approved = Field(Integer) 
    using_options(tablename = 'protocols') 

    def __repr__ (self): 
     return '%d' %(self.id) 

그리고 여기 내 파이썬 스크립트입니다 : 그것은 비교적 간단한 변화해야한다처럼

import smtplib 
import auth as auth 
import ProtocolModel as PM 
from elixir import * 
from datetime import datetime 

au = auth.UserAuth() 
setup_all() 
create_all() 
table = PM.Protocol 
records = table.query.all() 

if len(records) == 0: 
    print 'No records in Table' 
else: 
    for record in records: 
     setup_all() 
     if record.approved == 1: 
      print 'Completed' 
     else: 
      FROMADDR = au.google_user 
      LOGIN = FROMADDR 
      PASSWORD = au.google_password 
      TOADDRS = record.email 
      SUBJECT = "Weekly Research Update for " + record.irb_no + " - " + record.title 
      date1 = datetime.strptime(str(record.action_date), '%Y-%m-%d') 
      date2 = date1.strftime('%B %d, %Y') 
      msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (FROMADDR, ", ".join(TOADDRS), SUBJECT)) 
      msg += 'Dear' + ' ' + record.prefix + ' ' + record.fname + ' ' + record.lname + ',' + '\n' + '\n' 
      msg += 'Our records indicate that the most recent action on your research protocol titled ' + record.title + ' was taken on ' + str(date2) +'.' +'\n' 
      msg += 'This action was: ' + record.action 

      server = smtplib.SMTP('smtp.gmail.com', 587) 
      server.set_debuglevel(1) 
      server.ehlo() 
      server.starttls() 
      server.login(LOGIN, PASSWORD) 
      server.sendmail(FROMADDR, TOADDRS, msg) 
      server.quit() 

이 보인다,하지만 난 그냥 아니에요 이것에 대해 어떻게 가야하는지. 어떤 도움을 많이 주셔서 감사합니다, 감사합니다!

답변

0

나는 그것을 알아 냈다. 모델 파일의 새로운 엔티티 클래스에서 ManyToOne을 사용하고 파이썬 코드에서이를 참조했습니다. 일단 다시 들어가면 간단한 수정이되었습니다.

새로운 비약 모델 :

from elixir import * 
import auth as auth 
au = auth.UserAuth() 

metadata.bind = 'mysql://' + au.user + ':' + au.password + '@localhost/' + au.database 
metadata.bind.echo = True 

class Investigator(Entity): 
    id = Field(Integer, primary_key = True) 
    prefix = Field(Text) 
    fname = Field(Text) 
    lname = Field(Text) 
    email = Field(Text) 
    using_options(tablename = 'investigators') 

    def __repr__ (self): 
     return '%d' %(self.id) 


class Protocol(Entity): 
    id = Field(Integer, primary_key = True) 
    irb_no = Field(Text) 
    title = Field(Text) 
    investigator = ManyToOne('Investigator', colname='investigator_id') 
    action_date = Field(Date) 
    action = Field(Text) 
    approved = Field(Integer) 
    using_options(tablename = 'protocols') 

    def __repr__ (self): 
     return '%d' %(self.id) 

새로운 파이썬 스크립트 :

import smtplib 
import auth as auth 
import ProtocolModel1 as PM 
from elixir import * 
from datetime import datetime 

au = auth.UserAuth() 
setup_all() 
create_all() 
table = PM.Protocol 
records = table.query.all() 

if len(records) == 0: 
    print 'No records in Table' 
else: 
    for record in records: 
     setup_all() 
     if record.approved == 1: 
      print 'Completed' 
     else: 
      FROMADDR = au.google_user 
      LOGIN = FROMADDR 
      PASSWORD = au.google_password 
      TOADDRS = record.investigator.email 
      SUBJECT = "Weekly Research Update for " + record.irb_no + " - " + record.title 
      date1 = datetime.strptime(str(record.action_date), '%Y-%m-%d') 
      date2 = date1.strftime('%B %d, %Y') 
      msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (FROMADDR, ", ".join(TOADDRS), SUBJECT)) 
      msg += 'Dear' + ' ' + record.investigator.prefix + ' ' + record.investigator.fname + ' ' + record.investigator.lname + ',' + '\n' + '\n' 
      msg += 'Our records indicate that the most recent action on your research protocol titled ' + record.title + ' was taken on ' + str(date2) +'.' +'\n' 
      msg += 'This action was: ' + record.action 

      server = smtplib.SMTP('smtp.gmail.com', 587) 
      server.set_debuglevel(1) 
      server.ehlo() 
      server.starttls() 
      server.login(LOGIN, PASSWORD) 
      server.sendmail(FROMADDR, TOADDRS, msg) 
      server.quit()