User:Andre Castro/prototyping/1.2/traces: Difference between revisions

From XPUB & Lens-Based wiki
 
(9 intermediate revisions by 2 users not shown)
Line 1: Line 1:
=Trance=
<b>About the project:</b>
Traces is a story written by Giulia Ciliberto,
told by email in short parts, one per day
==Links==
==Links==
https://docs.google.com/Doc?docid=dcwxmjc8_17pr7bbsgz original text


http://pzwart3.wdka.hro.nl/~slorusso/email-form.html
'''
Front-end:
http://pzwart3.wdka.hro.nl/~slorusso/traces/'''
 
Form handler:
/home/acastro/public_html/cgi-bin/traces_form_handler.cgi
 
 
Text:
/home/acastro/public_html/cgi-bin/traces-text.txt


http://pzwart3.wdka.hro.nl/~acastro/cgi-bin/traces_form_handler.cgi
Database:
/home/acastro/public_html/cgi-bin/traces-database.xml




database in:
==Part1 Form and email subscription into database==
http://pzwart3.wdka.hro.nl/~acastro/cgi-bin/traces-email-database.xml


==******part1******==
Form handler:
Form and email / date appending email-database.xml
/home/acastro/public_html/cgi-bin/traces_form_handler.cgi


* online form
* users subscribe their email address in front-end


* cgi receives email address and appends it to email-database.xml file
* html page calls traces_form_handler.cgi
 
* cgi receives email address appends it within the today's date node in traces-database.xml


TO DO: date format not necessarily the best format - check others


http://pzwart3.wdka.hro.nl/~acastro/cgi-bin/traces_form_handler.cgi:


<source lang="python">
<source lang="python">
#!/usr/bin/python2.6
#!/usr/bin/python2.6
import cgi, cgitb, lxml.etree, datetime, os
import cgi, cgitb, lxml.etree, datetime, os
from datetime import *
date_now = datetime.now()
today = date_now.strftime("%Y-%m-%d")
date_delta = timedelta(days=22)
date_old = (date_now - date_delta).strftime("%Y-%m-%d")
print date_old


today = datetime.datetime.now().strftime("%Y-%m-%d") #not sure is this is the best format


# Create instance of FieldStorage  
# Create instance of FieldStorage  
Line 33: Line 53:




print "Content-Type: text/html" 
print                       
print "<TITLE>Form</TITLE>"
print "<H4>Your form was successfully added.<br />Shortly you will receive a message at %s </H4>" % (email)


#APPEND EMAIL AND DATE TO XML FILE


#APPEND EMAIL AND DATE TO XML FILE
if os.path.exists('/home/acastro/public_html/cgi-bin/traces-database.xml'):
if os.path.exists('/home/acastro/public_html/cgi-bin/traces-database.xml'):
print 
#open file
doc = lxml.etree.parse('/home/acastro/public_html/cgi-bin/traces-database.xml')
entries = doc.find('entries') # find root element
 
node_today = '//date[@date="'+ str(today) + '"]'
old_node = '//date[@date="'+ str(date_old ) + '"]'
 
#remove outdated addresses
for outdated in doc.xpath(old_node):
outdated.getparent().remove(outdated)# here I grab the parent of the element to call the remove directly on it
 
#check if todays date element is present
if today not in doc.xpath('//@date'):
date = lxml.etree.SubElement(entries, "date", attrib={'date':today} )  #append date SubElement date
addrs = lxml.etree.SubElement(date, "address")#append grandchild
addrs.text = str(email)
 
else:
test = doc.xpath(node_today)
addrs = lxml.etree.SubElement(test[0], "address")#append grandchild
addrs.text = email
 
doc.write('/home/acastro/public_html/cgi-bin/traces-database.xml',xml_declaration=True,encoding='utf-8') #write
 
 
 
else:   
else:   
#Create a new file
root = lxml.etree.Element('email-address')
root = lxml.etree.Element('email-address')
son = lxml.etree.SubElement(root, 'entries')
entries = lxml.etree.SubElement(root, 'entries')
dates = lxml.etree.SubElement(entries, "date", attrib={'date':today} )  #append date
addrs = lxml.etree.SubElement(dates, "address")#append grandchild
addrs.text = str(email)
tree = lxml.etree.ElementTree(root)
tree = lxml.etree.ElementTree(root)
tree.write('/home/acastro/public_html/cgi-bin/traces-database.xml', pretty_print=True, xml_declaration=True,encoding='utf-8')
tree.write('/home/acastro/public_html/cgi-bin/traces-database.xml', pretty_print=True, xml_declaration=True,encoding='utf-8')
tree.close()
tree.close()


</source>


#f = 'email-database.xml'
doc = lxml.etree.parse('/home/acastro/public_html/cgi-bin/traces-database.xml')
entries = doc.find('entries') # find root element


==part2 and 3 Days calculations and sending emails==




/home/acastro/public_html/cgi-bin/traces_date_email.py


node_today = '//date[@date="'+ str(today) + '"]'
Script which parses xml database.  
Checks the dates and email address under each date.
#check if todays date element is present
According the date decides what part of story will be send
if today not in doc.xpath('//@date'):
date = lxml.etree.SubElement(entries, "date", attrib={'date':today} )  #append date SubElement date
addrs = lxml.etree.SubElement(date, "address")#append grandchild
addrs.text = str(email)
doc.write('/home/acastro/public_html/cgi-bin/traces-database.xml', xml_declaration=True,  encoding='utf-8') #write


else:
test = doc.xpath(node_today)
print lxml.etree.tostring(test[0])
addrs = lxml.etree.SubElement(test[0], "address")#append grandchild
addrs.text = email
doc.write('/home/acastro/public_html/cgi-bin/traces-database.xml', xml_declaration=True,  encoding='utf-8') #write
   
   


</source>
<source lang="python">
#! /usr/bin/python
# coding: utf-8
import lxml.etree, re
import smtplib, email.utils
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from datetime import *


==******part2******==
# Script that:
Days and Emails calculations
# 1: parses xml database.
# 2: Checks the dates and email address under each date
# 3: Sends the corresponding email part


Other py script which:
#CRON IT FOR 1 x per Day


* parse the email-database.xml (every day)  
text_file = open('/home/acastro/public_html/cgi-bin/traces-text.txt', "r")
text = text_file.read() #CONTENT INTO VARIABLE !!!!


Script which parses xml database. Checks the dates and email address under each dat3.
text_splited = text.split("\n\n@\n\n")


According the date decide what part of story will be told
print text_splited[0]
print '##'
print text_splited[1]
print '##'
print len(text_splited)


<source lang="python">
f = ('/home/acastro/public_html/cgi-bin/traces-database.xml')  
#! /usr/bin/python
database = lxml.etree.parse(f)
# coding: utf-8
import lxml.etree, urllib2
#Script which parses xml database. Checks the dates and email address under each date
f = ('traces-email-database.xml') # change to local
#f = urllib2.urlopen('http://pzwart3.wdka.hro.nl/~acastro/cgi-bin/traces-email-database.xml') #ERROR! ??permissions
   
   
dates = database.xpath('//date') # database find dates
#create the dictionary {date: [address, address]}
dateDict = {}
for date_subscription in dates:
   
   
doc = lxml.etree.parse(f)
date_is_attr = date_subscription.get("date")
myAddrs = database.xpath("//date[@date='{0}']/address/text()".format(date_is_attr))
# find dates
dateDict[date_is_attr] = myAddrs
dates = doc.xpath('//date')
#print dateDict




#creat list of 19 day dates, today and before today
dates = []
for day in range(20):
date = date.today()
delta = timedelta(days= day)
subtract = date - delta
dates.append(str(subtract))
print dates


#create the dictionary {date: [address, address]}
dateDict = {}
for date in dates:
    #print lxml.etree.tostring(date)
    date_is_attr = date.get("date")
    myAddrs = doc.xpath("//date[@date='{0}']/address/text()".format(date_is_attr))
    dateDict[date_is_attr] = myAddrs


#checks the dates when emails were subscribe
#matchs them with the dates list
#sends the corresponding email part
for date in dateDict.keys():
print date
for i, value in enumerate(dates):


# compare the dates with the current
if str(date) == value:
from datetime import *
email_addrs = dateDict[date] # list of receivers
import re
print email_addrs
today = str(date.today())
yesterday = str(date.today()-timedelta(days=1))
email_body = '<html><body><div style="text-align: center; font-family: serif; font-size: 15px;"><br/><br/>@<br/><br/>' + text_splited[i] + '<br/><br/>@<br/><br/></div></body></html>'
beforeyesterday = str(date.today()-timedelta(days=2))


msg = MIMEMultipart('alternative') #Create Multipart msg (allows html)
msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net'))
msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net'))
msg['Subject'] = 'Traces @ part#' + str((i+1))


part_html = MIMEText(email_body, 'html')
msg.attach(part_html)


for date, addrs in dateDict.iteritems():
server = smtplib.SMTP('localhost')
    #print date
server.set_debuglevel(False) # show communication with the server
    #print addrs
try:
    print
server.sendmail('traces@noreply.net', email_addrs, msg.as_string())
    if str(date) == today :
finally:
        print "send first mail to:"
server.quit()
        for a in addrs :
            print a
    elif date == yesterday :
        print "send second mail to:"
        for a in addrs :
            print a
    elif date == beforeyesterday :
        print "send third mail to:"
        for a in addrs :
            print a
</source>
</source>


   
   
* check the dates
* see what section of the text needs to send to whom






==******part3 Email the sections******==
 
==Examples on sending email ==




Line 178: Line 229:




server = smtplib.SMTP('mail')
server = smtplib.SMTP('localhost')
server.set_debuglevel(False) # show communication with the server
server.set_debuglevel(False) # show communication with the server
try:
try:
Line 203: Line 254:




server = smtplib.SMTP('mail')
server = smtplib.SMTP('localhost')
server.set_debuglevel(False) # show communication with the server
server.set_debuglevel(False) # show communication with the server
try:
try:

Latest revision as of 15:05, 29 March 2012

Trance

About the project: Traces is a story written by Giulia Ciliberto, told by email in short parts, one per day

Links

Front-end: http://pzwart3.wdka.hro.nl/~slorusso/traces/

Form handler: /home/acastro/public_html/cgi-bin/traces_form_handler.cgi


Text: /home/acastro/public_html/cgi-bin/traces-text.txt

Database: /home/acastro/public_html/cgi-bin/traces-database.xml


Part1 Form and email subscription into database

Form handler: /home/acastro/public_html/cgi-bin/traces_form_handler.cgi

  • users subscribe their email address in front-end
  • html page calls traces_form_handler.cgi
  • cgi receives email address appends it within the today's date node in traces-database.xml


#!/usr/bin/python2.6
import cgi, cgitb, lxml.etree, datetime, os
from datetime import *

date_now = datetime.now()
today = date_now.strftime("%Y-%m-%d") 
date_delta = timedelta(days=22)

date_old = (date_now - date_delta).strftime("%Y-%m-%d") 
print date_old


# Create instance of FieldStorage 
form = cgi.FieldStorage() 
# Get email from form 
email = form.getvalue('email') 



#APPEND EMAIL AND DATE TO XML FILE

if os.path.exists('/home/acastro/public_html/cgi-bin/traces-database.xml'):
	#open file
	doc = lxml.etree.parse('/home/acastro/public_html/cgi-bin/traces-database.xml')
	entries = doc.find('entries') # find root element

	node_today = '//date[@date="'+ str(today) + '"]'
	old_node = '//date[@date="'+ str(date_old ) + '"]'

	#remove outdated addresses
	for outdated in doc.xpath(old_node):
		outdated.getparent().remove(outdated)# here I grab the parent of the element to call the remove directly on it

	#check if todays date element is present
	if today not in doc.xpath('//@date'): 
		date = lxml.etree.SubElement(entries, "date", attrib={'date':today} )  	#append date SubElement date
		addrs = lxml.etree.SubElement(date, "address")#append grandchild
		addrs.text = str(email)

	else:
		test = doc.xpath(node_today)
		addrs = lxml.etree.SubElement(test[0], "address")#append grandchild
		addrs.text = email

	doc.write('/home/acastro/public_html/cgi-bin/traces-database.xml',xml_declaration=True,encoding='utf-8') #write



else:  
	#Create a new file
	root = lxml.etree.Element('email-address')
	entries = lxml.etree.SubElement(root, 'entries')
	dates = lxml.etree.SubElement(entries, "date", attrib={'date':today} )  	#append date
	addrs = lxml.etree.SubElement(dates, "address")#append grandchild
	addrs.text = str(email)
	tree = lxml.etree.ElementTree(root)
	tree.write('/home/acastro/public_html/cgi-bin/traces-database.xml', pretty_print=True, xml_declaration=True,encoding='utf-8')
	tree.close()


part2 and 3 Days calculations and sending emails

/home/acastro/public_html/cgi-bin/traces_date_email.py

Script which parses xml database. Checks the dates and email address under each date. According the date decides what part of story will be send


#! /usr/bin/python
# coding: utf-8
import lxml.etree, re
import smtplib, email.utils
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from datetime import *

# Script that:
# 1: parses xml database. 
# 2: Checks the dates and email address under each date 
# 3: Sends the corresponding email part

#CRON IT FOR 1 x per Day

 
text_file = open('/home/acastro/public_html/cgi-bin/traces-text.txt', "r")
text = text_file.read() #CONTENT INTO VARIABLE !!!!

text_splited = text.split("\n\n@\n\n")

print text_splited[0]
print '##'
print text_splited[1]
print '##'
print len(text_splited)

f = ('/home/acastro/public_html/cgi-bin/traces-database.xml') 
database = lxml.etree.parse(f)
 
dates = database.xpath('//date') # database find dates 
#create the dictionary {date: [address, address]}
dateDict = {}
for date_subscription in dates:
 
	date_is_attr = date_subscription.get("date")
	myAddrs = database.xpath("//date[@date='{0}']/address/text()".format(date_is_attr))
	dateDict[date_is_attr] = myAddrs
#print dateDict


#creat list of 19 day dates, today and before today 
dates = []
for day in range(20):
	date = date.today()
	delta = timedelta(days= day)
	subtract = date - delta	
	dates.append(str(subtract))
 
print dates


#checks the dates when emails were subscribe 
#matchs them with the dates list
#sends the corresponding email part
for date in dateDict.keys():
	print date
	for i, value in enumerate(dates):

		if str(date) == value:
			email_addrs = dateDict[date] # list of receivers
			print email_addrs
			
			email_body =  '<html><body><div style="text-align: center; font-family: serif; font-size: 15px;"><br/><br/>@<br/><br/>' + text_splited[i] + '<br/><br/>@<br/><br/></div></body></html>'		
		

			msg = MIMEMultipart('alternative') #Create Multipart msg (allows html)
			msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net'))
			msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net'))
			msg['Subject'] = 'Traces @ part#' + str((i+1))

			part_html = MIMEText(email_body, 'html')
			msg.attach(part_html)

			server = smtplib.SMTP('localhost')
			server.set_debuglevel(False) # show communication with the server
			try:
				server.sendmail('traces@noreply.net', email_addrs, msg.as_string())
			finally:
				server.quit()




Examples on sending email

  • multipart email - allows imgs attachments
import smtplib, email.utils
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

#Reference: http://docs.python.org/library/email-examples.html


# address list
addr = ['andrecastro@c-e-m.org', 'andrecastro83@gmail.com']#, 'silviolorusso@gmail.com']

msg = MIMEMultipart()
#msg = MIMEText('This is the b@dy of the message.') #Create the message (simple ASCII)
msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net'))
msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net'))
msg['Subject'] = 'Traces Multipart - test'

msg.attach( MIMEText('This is the b@dy of the email') )

#attach a picture
fp = open('animpnky_e0.gif', 'rb')
img = MIMEImage(fp.read())
fp.close()
msg.attach(img)


server = smtplib.SMTP('localhost')
server.set_debuglevel(False) # show communication with the server
try:
    server.sendmail('traces@noreply.net', addr, msg.as_string())
finally:
    server.quit()


  • text email - plain text
import smtplib, email.utils
from email.mime.text import MIMEText

# address list
addr = ['andrecastro@c-e-m.org', 'andrecastro83@gmail.com']
#, 'silviolorusso@gmail.com']

msg = MIMEText('This is the b@dy of the message.') #Create the message (simple ASCII)
msg['To'] = email.utils.formataddr(('Recipient', 'readers@traces.net'))
msg['From'] = email.utils.formataddr(('Traces', 'traces@noreply.net'))
msg['Subject'] = 'Traces plain - test '


server = smtplib.SMTP('localhost')
server.set_debuglevel(False) # show communication with the server
try:
    server.sendmail('traces@noreply.net', addr, msg.as_string())
finally:
    server.quit()