adding all of botlist, initial add
[botlist.git] / botlistprojects / botbert / lib / python / business / scan_feed_bom.py
blobf9b2d9596351bc17bdf35285629643af7d219ab3
1 """
2 Berlin Brown
3 6/20/2007
5 business object model
6 """
7 __author__ = "Berlin Brown"
8 __version__ = "0.1"
10 import MySQLdb
11 import cgi
12 import random
14 import util.keyword_processor as textutils
15 from util.text_utils import formatStrAscii, formatDescrWithSoup
16 from botlist_business_object import BotlistBusinessObject
18 SQL_PREFIX = "'"
19 SQL_SUFFIX = "', "
20 SQL_EMPTY = "'', "
22 MAX_BOT_RATING = 0
24 """
25 ------------------------------------------------
26 Bean Definitions for Object Mapping
27 ------------------------------------------------
28 """
29 class ScanFeed:
30 def __init__(self):
31 self.mainUrl = None
32 self.urlTitle = None
33 self.urlDescription = None
34 self.urlSource = None
36 class FeedItem:
37 def __init__(self):
38 self.mainUrl = None
39 self.urlTitle = None
40 self.urlDescription = None
41 self.urlSource = None
42 self.channelURL = None
44 def verify(self):
45 """ Because we are inserting these values into the database,
46 ensure that a zero length value is returned as opposed to null"""
47 self.channelURL = self.channelURL and self.channelURL or ''
48 self.channelURL = self.channelURL.strip()
50 class EntityLink:
51 def __init__(self):
52 self.mainUrl = None
53 self.urlTitle = None
54 self.urlDescription = None
56 class CountFeedItems:
57 def __init__(self):
58 self.count = None
60 #--------------------------------------
61 class ScanFeedHandler(BotlistBusinessObject):
62 def createItem(self, url, title, descr, source, hostname):
63 try:
64 sql_set = []
65 sql_set.append("insert into system_feed_items(main_url, url_title, url_description, url_source, hostname) values(")
66 sql_set.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # main_url
67 sql_set.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # url_title
68 sql_set.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # url_descr
69 sql_set.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # url_source
70 sql_set.append(SQL_PREFIX + "%s" + SQL_PREFIX) # hostname
71 sql_set.append(")")
72 sql_str = ''.join(sql_set)
73 cursor = self.conn.cursor()
75 url_val = url.encode("utf-8").replace("'", "")
76 title_val = formatStrAscii(title).replace("'", "")
77 descr_val = formatDescrWithSoup(formatStrAscii(descr)).replace("'", "")
78 source_val = source.encode("utf-8").replace("'", "")
79 host_val = hostname.encode("utf-8").replace("'", "")
81 cursor.execute(sql_str % (url_val, title_val, descr_val, source_val, host_val))
82 cursor.close()
83 except Exception, ex:
84 # Typically a unique id exception
85 raise ex
87 def updateInsertEntityProcessCount(self, link, title, user_name, hostname):
88 """ Complete transfer by inserting into the entity link table
89 for display to the user"""
90 data = None
91 try:
92 cursor = self.conn.cursor()
93 sql_set = []
94 sql_set.append("update system_feed_items set process_count = 1 where main_url = '%s'")
95 sql_str = ''.join(sql_set)
96 cursor.execute(sql_str % link)
97 sql_set = None
99 # Filter title and keywords
100 cleanTitle = textutils.filterNonAscii(title.encode('utf-8', 'ignore'))
101 keywordTitle = textutils.createKeywords(cleanTitle)
103 if MAX_BOT_RATING > 0:
104 rnd_val = random.randint(1, MAX_BOT_RATING)
105 else:
106 rnd_val = 0
108 sql_set2 = []
109 sql_set2.append("insert into entity_links(main_url, url_title, full_name, keywords, rating, hostname, created_on) values(")
110 sql_set2.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # main_url
111 sql_set2.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # title
112 sql_set2.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # username
113 sql_set2.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # keywords
114 sql_set2.append("%s,") # rating (currently set to random value)
115 if hostname:
116 sql_set2.append(SQL_PREFIX + "%s" + SQL_SUFFIX) # hostname
117 else:
118 # Create a record with a NULL entry
119 hostname = "NULL"
120 sql_set2.append("%s,") # hostname
122 sql_set2.append("NOW())") # created_on
123 sql_str = ''.join(sql_set2)
124 cursor.execute(sql_str % (link, cleanTitle, user_name, keywordTitle, rnd_val, hostname))
125 cursor.close()
126 except MySQLdb.OperationalError, message:
127 errorMessage = "ERR %d:\n%s" % (message[0], message[1])
128 return 0
130 def hasEntityLink(self, link):
131 data = None
132 try:
133 cursor = self.conn.cursor()
134 sql_set = []
135 sql_set.append("select count(1) from entity_links where main_url = '%s'")
136 sql_str = ''.join(sql_set)
137 cursor.execute(sql_str % (link))
138 data = cursor.fetchall()
139 cursor.close()
140 except MySQLdb.OperationalError, message:
141 errorMessage = "ERR %d:\n%s" % (message[0], message[1])
142 print errorMessage
143 return 0
145 if data:
146 if len(data) > 0:
147 return data[0][0]
148 else:
149 return 0
150 else:
151 return 0
153 def listSystemFeedItems(self):
154 """System feed item articles have been inserted, now tranfer
155 these items into the entity links table"""
156 data = None
157 try:
158 cursor = self.conn.cursor()
159 sql_set = []
160 sql_set.append("select main_url, url_title, url_description, url_source, hostname from system_feed_items where process_count = 0 order by RAND()")
161 sql_str = ''.join(sql_set)
162 cursor.execute(sql_str)
163 data = cursor.fetchall()
164 self.fields = cursor.description
165 cursor.close()
166 except MySQLdb.OperationalError, message:
167 errorMessage = "ERR %d:\n%s" % (message[0], message[1])
168 print errorMessage
169 return None
171 if not data:
172 raise "ERR: No data returned during listSystemFeedItems() call (try to run a scan on feeds)."
174 transform_data = []
175 for row in data:
176 # FeedItem(rs,rs,rs,rs)
177 feed_item = FeedItem()
178 feed_item.mainUrl = cgi.escape(row[0])
179 feed_item.urlTitle = cgi.escape(row[1])
180 feed_item.urlDescription = cgi.escape(row[2])
181 feed_item.urlSource = cgi.escape(row[3])
182 if row[4]:
183 feed_item.channelURL = cgi.escape(row[4])
185 transform_data.append(feed_item)
187 return transform_data
189 def listScanFeeds(self):
190 """Return a list of ScanFeed items"""
191 data = None
192 try:
193 cursor = self.conn.cursor()
194 sql_set = []
195 sql_set.append("select main_url, url_title, url_description, url_source from system_scan_feeds order by RAND()")
196 sql_str = ''.join(sql_set)
197 cursor.execute(sql_str)
198 data = cursor.fetchall()
199 self.fields = cursor.description
200 cursor.close()
201 except MySQLdb.OperationalError, message:
202 errorMessage = "ERR %d:\n%s" % (message[0], message[1])
203 print errorMessage
204 return None
206 if not data:
207 return None
209 # Transform into a list of simple objects
210 transform_data = []
211 for row in data:
212 feed = ScanFeed()
213 feed.mainUrl = cgi.escape(row[0])
214 feed.urlTitle = cgi.escape(row[1])
215 feed.urlDescription = cgi.escape(row[2])
216 feed.urlSource = cgi.escape(row[3])
217 transform_data.append(feed)
219 return transform_data
221 # End of the file