./ 0000777 0000000 0000000 00000000000 10756166723 011376 5 ustar 00user group 0000000 0000000 ABOUT 0000666 0000000 0000000 00000001226 10756165231 012030 0 ustar 00user group 0000000 0000000 This appliance is one example of how a basic blog might be implemented upon the web2py web application framework. Some noteworthy features include: - Registration and authentication required for blog editing. - Use of css for graphic layout. - Multiple views of blog posts, including by number of comments and by most recent comments. Some things left to do would be: - UI for editing blog posts. Currently, it is expected to use the web2py administrative interface. - For entering blog posts, perhaps adopt a wiki-style markup instead of relying on the poster to enter html tags. Our hope is for this to be a great starting point for a full-featured blog. LICENSE 0000666 0000000 0000000 00000003113 10756166723 012244 0 ustar 00user group 0000000 0000000 Copyright (C) 2008 Kenneth J. Ore and Damian Gadek. All Rights Reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the names Kenneth J. Ore nor Damian Gadek, nor the names of its contributors may be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact ken_ore@hotmail.com and d_gadek@yahoo.com. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CLARKWARE CONSULTING OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. __init__.py 0000666 0000000 0000000 00000000000 10745732752 013337 0 ustar 00user group 0000000 0000000 cache/ 0000777 0000000 0000000 00000000000 10756166365 012306 5 ustar 00user group 0000000 0000000 cache/cache.lock 0000666 0000000 0000000 00000000000 10750411700 014165 0 ustar 00user group 0000000 0000000 controllers/ 0000777 0000000 0000000 00000000000 10756166365 013611 5 ustar 00user group 0000000 0000000 controllers/appadmin.py 0000666 0000000 0000000 00000012440 10746522770 015750 0 ustar 00user group 0000000 0000000 ########################################################### ### make sure administrator is on localhost ############################################################ import os from gluon.contenttype import contenttype from gluon.fileutils import check_credentials if request.env.remote_addr!=request.env.http_host.split(':')[0]: raise HTTP(400) if not check_credentials(request): redirect('/admin') response.view='appadmin.html' response.menu=[['design',False,'/admin/default/design/%s' % request.application], ['db',False,'/%s/%s/index' % (request.application, request.controller)], ['state',False,'/%s/%s/state' % (request.application, request.controller)]] ########################################################### ### list all tables in database ############################################################ def index(): import types as _types _dbs={} for _key,_value in globals().items(): if isinstance(_value,SQLDB): tables=_dbs[_key]=[] for _tablename in _value.tables: tables.append((_key,_tablename)) return dict(dbs=_dbs) ########################################################### ### insert a new record ############################################################ def insert(): try: dbname=request.args[0] db=eval(dbname) table=request.args[1] form=SQLFORM(db[table]) except: redirect(URL(r=request,f='index')) if form.accepts(request.vars,session): response.flash='new record inserted' return dict(form=form) ########################################################### ### list all records in table and insert new record ############################################################ def download(): filename=request.args[0] response.headers['Content-Type']=contenttype(filename) return open(os.path.join(request.folder,'uploads/','%s' % filename),'rb').read() def csv(): import gluon.contenttype, csv, cStringIO response.headers['Content-Type']=gluon.contenttype.contenttype('.csv') try: dbname=request.vars.dbname db=eval(dbname) records=db(request.vars.query).select() except: redirect(URL(r=request,f='index')) s=cStringIO.StringIO() writer = csv.writer(s) writer.writerow(records.colnames) c=range(len(records.colnames)) for i in range(len(records)): writer.writerow([records.response[i][j] for j in c]) ### FILL HERE return s.getvalue() def import_csv(table,file): import csv reader = csv.reader(file) colnames=None for line in reader: if not colnames: colnames=[x[x.find('.')+1:] for x in line] c=[i for i in range(len(line)) if colnames[i]!='id'] else: items=[(colnames[i],line[i]) for i in c] table.insert(**dict(items)) def select(): try: dbname=request.args[0] db=eval(dbname) if not request.vars.query: table=request.args[1] query='%s.id>0' % table else: query=request.vars.query except: redirect(URL(r=request,f='index')) if request.vars.csvfile!=None: try: import_csv(db[table],request.vars.csvfile.file) response.flash='data uploaded' except: response.flash='unable to parse csv file' if request.vars.delete_all and request.vars.delete_all_sure=='yes': try: db(query).delete() response.flash='records deleted' except: response.flash='invalid SQL FILTER' elif request.vars.update_string: try: env=dict(db=db,query=query) exec('db(query).update('+request.vars.update_string+')') in env response.flash='records updated' except: response.flash='invalid SQL FILTER or UPDATE STRING' if request.vars.start: start=int(request.vars.start) else: start=0 limitby=(start,start+100) try: records=db(query).select(limitby=limitby) except: response.flash='invalid SQL FILTER' return dict(records='no records',nrecords=0,query=query,start=0) linkto=URL(r=request,f='update/%s'% (dbname)) upload=URL(r=request,f='download') return dict(start=start,query=query,\ nrecords=len(records),\ records=SQLTABLE(records,linkto,upload,_class='sortable')) ########################################################### ### edit delete one record ############################################################ def update(): try: dbname=request.args[0] db=eval(dbname) table=request.args[1] except: redirect(URL(r=request,f='index')) try: id=int(request.args[2]) record=db(db[table].id==id).select()[0] except: redirect(URL(r=request,f='select/%s/%s'%(dbname,table))) form=SQLFORM(db[table],record,deletable=True, linkto=URL(r=request,f='select/'+dbname), upload=URL(r=request,f='download/')) if form.accepts(request.vars,session): response.flash='done!' redirect(URL(r=request,f='select/%s/%s'%(dbname,table))) return dict(form=form) ########################################################### ### get global variables ############################################################ def state(): return dict(state=request.env) controllers/default.py 0000666 0000000 0000000 00000004005 10752401550 015566 0 ustar 00user group 0000000 0000000 import datetime def getpostsandcomments(): blogposts = db().select(db.blogposts.ALL, orderby=~db.blogposts.datetime) blogposts_numcomments = db().select(db.blogposts.ALL, orderby=~db.blogposts.numcomments|~db.blogposts.datetime) commentsnposts = db(db.blogcomments.blogpost_id == db.blogposts.id) comments = commentsnposts.select(db.blogcomments.author, db.blogcomments.blogpost_id, db.blogposts.title, orderby=~db.blogcomments.datetime, limitby=(0,10)) return dict(blogposts=blogposts, blogposts_numcomments=blogposts_numcomments, comments=comments) def index(): return getpostsandcomments() def createblogpost(): if session.authorized: myd = getpostsandcomments() form=SQLFORM(db.blogposts,fields=['title','post']) if form.accepts(request.vars,session): response.flash='new blogpost inserted' redirect('/' + request.application + "/default/index") myd['form'] = form return myd else: redirect('/' + request.application + "/identity/login") def showblogpost(): myd = getpostsandcomments() blogid = request.args[0] singleblogpost = db(db.blogposts.id == blogid).select()[0] singleblogpost_comments = db(db.blogcomments.blogpost_id == blogid).select(orderby=~db.blogcomments.datetime) db.blogcomments.blogpost_id.default=singleblogpost.id form=SQLFORM(db.blogcomments,fields=['author', 'email', 'comment', 'url'],labels={'author':'Your Name', 'email':'Your email address', 'comment':'Comment', 'url':'Url (optional)'}) if form.accepts(request.vars,session): blogpostupdate=db(db.blogposts.id==blogid).select() if len(blogpostupdate)>0: blogpostupdate[0].update_record(numcomments=blogpostupdate[0].numcomments + 1) redirect('/' + request.application + "/default/showblogpost/" + str(singleblogpost.id) + "#Reader_Comments") myd['form'] = form myd['singleblogpost'] = singleblogpost myd['singleblogpost_comments'] = singleblogpost_comments return myd controllers/identity.py 0000666 0000000 0000000 00000010536 10752370462 016010 0 ustar 00user group 0000000 0000000 import md5, random def login(): form=FORM(TABLE(TR("User Name:",INPUT(_name="email",requires=IS_NOT_EMPTY())), TR("Password:",INPUT(_name="password",_type='password', requires=[IS_NOT_EMPTY(),CRYPT()])), TR("",INPUT(_type="submit",_value="login")))) if form.accepts(request.vars,session): r=db(db.user.email==form.vars.email)\ (db.user.password==form.vars.password)\ (db.user.verification=='')\ .select() if len(r)>0: session.user_id=r[0].id session.username=r[0].email session.authorized=True session.flash='You are logged in' redirect(URL(r=request,c='default',f='index')) else: response.flash='Invalid login' if form.errors: response.flash='Invalid login' link1=A('register',_href=URL(r=request,f='register')) link2=A('forgot password',_href=URL(r=request,f='retrieve')) return dict(form=form) def logout(): session.authorized=False session.flash="Logged out" redirect(URL(r=request,c='default',f='index')) def register(): import random, md5 form=FORM(TABLE(TR("User Name:",\ INPUT(_name="email",requires=[IS_NOT_EMPTY(),\ IS_NOT_IN_DB(db,'user.email')])),\ TR("Password:",\ INPUT(_name="password",_type='password',requires=[IS_NOT_EMPTY(),CRYPT()])),\ TR("Password (again):",\ INPUT(_name="password2",_type='password',requires=[IS_NOT_EMPTY(),CRYPT()])),\ TR("",INPUT(_type="submit",_value="register")))) if form.accepts(request.vars,session) and \ form.vars.password==form.vars.password2: key=md5.new(str(random.randint(0,9999))).hexdigest() id=db.user.insert(email=form.vars.email, password=form.vars.password, verification=key) r=db(db.user.id==id)\ (db.user.verification==key)\ .select() if len(r)==0: raise HTTP(400,'page does not exist') r[0].update_record(verification='') session.authorized=True session.user_id=r[0].id session.username=r[0].email if r[0].password=='': response.flash='You must change your password' else: session.flash='registration complete and you are now logged in' redirect(URL(r=request,c='default',f='index')) elif form.vars.password!=form.vars.password2: form.errors.password2='passwords do not match' response.flash="Form error" return dict(form=form) def retrieve(): form=FORM(TABLE(TR("Username:",INPUT(_name="email",requires=[IS_NOT_EMPTY(),IS_IN_DB(db,'user.email')])), TR("",INPUT(_type="submit",_value="retrieve")))) if form.accepts(request.vars,session): r=db(db.user.email==form.vars.email).select() if len(r): key=md5.new(str(random.randint(0,9999))).hexdigest() id=r[0].id r[0].update_record(password='',verification=key) message="To change your password visit: http://%s/%s/identity/verify?id=%s&key=%s"%(request.env.http_host,request.application,id,key) try: email(EMAIL_SENDER,form.vars.email,'registration',message) redirect(URL(r=request,f='login')) response.flash="We sent you an email" except: print message response.flash="Internal error, we are unable to send the email" else: form.errors.email='email not in database' response.flash="Form error" return dict(form=form) def change_password(): if not session.authorized: redirect(URL(r=request,f='login')) form=FORM(TABLE(TR("Password:",INPUT(_name="password",requires=[IS_NOT_EMPTY(),CRYPT()])), TR("Password (again):",INPUT(_name="password2",requires=[IS_NOT_EMPTY(),CRYPT()])), TR("",INPUT(_type="submit",_value="register")))) if form.accepts(request.vars,session) and \ form.vars.password==form.vars.password2: db(db.user.id==session.user_id).update(password=form.vars.password) response.flash='password updated' elif form.vars.password!=form.vars.password2: form.errors.passwords2='passwords do not match' response.flash="Form error" return dict(form=form) databases/ 0000777 0000000 0000000 00000000000 10756166365 013172 5 ustar 00user group 0000000 0000000 databases/db.db 0000666 0000000 0000000 00000036000 10752402166 014051 0 ustar 00user group 0000000 0000000 SQLite format 3 @ / 4 #4 3%%9tableblogcommentsblogcommentsCREATE TABLE [blogcomments] ( [id] INTEGER PRIMARY KEY AUTOINCREMENT NULL, [comment] CHAR(32) NULL, [blog{tableuseruserCREATE TABLE user( id INTEGER PRIMARY KEY AUTOINCREMENT, email CHAR(32), password CHAR(32), verification CHAR(32) )%%YtableblogcommentsblogcommentsCREATE TABLE [blogcomments] ( [id] INTEGER PRIMARY KEY AUTOINCREMENT NULL, [comment] CHAR(32) NULL, [blogpost_id] CHAR(32) NULL, [datetime] TIMESTAMP NULL, [author] CHAR(32) NULL, [url] CHAR(32) NULL , email CHAR(32))P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)ZtableblogpostsblogpostsCREATE TABLE blogposts( id INTEGER PRIMARY KEY AUTOINCREMENT, title CHAR(32), timedate CHAR(32), content CHAR(32) , post TEXT, datetime CHAR(32), author CHAR(32), numcomments INTEGER) user%blogcomments blogposts on and answer where I stand on the question. After all, I asked the q5 o3EIt does seem like the effort has gone up. The speed of play seems a lot higher throughout the first 4th of the game throughout the NBA. As long as games aren't called because of rain again the playoffs should be extra exciting this year. 12008-01-28 11:08:00freezershttp://www.aboutfreezers.comK 139Not for Knicks fans. We are sick of the Isiah/Marbury controvesy. I'll still trade basketball options, but you couldn't drag me to the Garden. 12008-01-28 11:07:00FLChttp://www.nofavor.com E3?You can tell the difference in the intensity of play on a day to day basis. Its really exciting. The West is so stacked that even for teams that secure the #1 or #2 seed, they could end up having to play against a team like the Lakers (who will be at full strength by then) in the first round. Whoever comes out of the West will have earned it. 12008-01-28 10:59:00Jake Khttp://www.lets-krong.com g Q G3!Is this the best NBA season ever ?
I haven't done the research to find out when the last time 7 games separated one conference's top 10 teams, all with a winning record and playing good basketball this late in the season. It hasn't happened in the 8 years I have owned the Mavs.
This year is shaping up to be a crazy one. A 5 or 6 game losing streak and any of the 4 teams who have had the best record in the west over the past month could find themselves out of the playoffs.
This scenario is not lost on players or fans. The feel in arenas lately have been very playoff like. You can feel the energy as fans know what is at stake. Players are looking at the standings and paying far closer attention to game by game results of division and conference teams. They know what is at stake with every game.
2008-01-28 10:17:00Mark Cuban 3 3 e 3 0 3sdfgsdfg52008-02-05 16:29:03sdfgsdfdsdfgsH E3!i shoulda won the superbowl!12008-02-04 07:49:52terrellwww.to.comG ;3!#i am another comment!!!12008-02-04 07:47:25psychostikwww.esp.com9 35goforit12008-02-03 23:32:29kjohttp://www.what.everJ e3]AOne thing I have learned about many of the young people of today, they are very short sided. The future does not exist to them except how they play it out in their minds. Basically, many are complete idiots that really have never been taught right from wrong and therefore wrong is what they see it to be. What he did was wrong. You have learned a valuable lesson. I would imagine these two posts are not going to help much with his future but I am sure he thinks this is the best thing that ever could have happened to his "career". I guess he would be right in case his future bosses are as clueless as he is.22008-01-24 16:41:00Seach Engine Optimization - Terry Reeveshttp://www.terryreeves.com h f h 1 o3EIt does seem like the effort has gone up. The speed of play seems a lot higher throughout the first 4th of the game throughout the NBA. As long as games aren't called because of rain again the playoffs should be extra exciting this year. 12008-01-28 11:08:00freezershttp://www.aboutfreezers.comG 139Not for Knicks fans. We are sick of the Isiah/Marbury controvesy. I'll still trade basketball options, but you couldn't drag me to the Garden. 12008-01-28 11:07:00FLChttp://www.nofavor.com E3?You can tell the difference in the intensity of play on a day to day basis. Its really exciting. The West is so stacked that even for teams that secure the #1 or #2 seed, they could end up having to play against a team like the Lakers (who will be at full strength by then) in the first round. Whoever comes out of the West will have earned it. 12008-01-28 10:59:00Jake Khttp://www.lets-krong.com I z 3=Mark, again, I think you're missing the point here. The content of the interview WAS and REMAIN 4 73 My friend, this all reeks of a childish immaturity. Will Leitch made reference to you (in a positive light, nonetheless) in his book, and this reference was posted on Valley. He quoted an article that he himself wrote, and that is his intellectual property. Why is this a problem? Because you dislike the blog he posted it on? That's ludicrous. This has nothing to do with 'ethics.' It has everything to do with some outlandish personal vendetta you have against Deadspin. If you complained about every journalist-- official of blogger-- who ever said anything about you, you spend the rest of your life complaining. Bluntly, why such a stick up your ass?22008-01-24 16:27:00Act S solely for GQ. As Will has pointed out in his subsequent responses, he merely quoted the interview on Valleywag - and to extend that, I should point out that Deadspin simply alerted its readership to the existence of this kerfuffle. If there were a blog bill of rights, the first stanza would deal with the inalienable right to take any and everything to the most meta level possible. Writing about stuff one wrote about is a mainstay of non-fiction - and do you think for one second that if you HAD conducted the interview via email that that would have insulated you from Will writing about that series of correspondence? PS - Nice, largely ignored, bitch slap of Tony Snow on Bill Maher. I noticed he didn't really change the substance of his argument when you informed him that in fact you ARE qualified to have a "technical conversation". Bravo. 22008-01-24 16:30:00Microbanohttp://www.microbano.com clueless as he is.22008-01-24 16:41:00Seach Engine Optimization - Terry Reeveshttp://www.terryreeves.com MMMdamianfe0b714aaecbd5c8961+ M damianfe0b714aaecbd5c8961994c655d18a0d B +3 /testing comment62008-02-06 13:03:16damianyou@something.com g the following comment "Cuban was not amused and spent most of the interview accusing Deadspin of being the Inside Edition of sports. So that was fun.) " diminish the integrity of the interview itself ? Probably not, but to some readers of ValleyWag and GQ, it could. Unethical ? Probably not. Stupid business, definitely.For the record, I certainly didnt spend most of the interview talking about his blog, but I certainly had fun at his expense from time to time and I never said it was off the record. Although , again, this was a GQ interview. Setup and arranged with the magazine with no consideration on my part as to who would do the piece until Will showed up.
Which leads to my conclusion about all of this.
Its my fault. I was stupid to think that the guy who runs Deadspin could stop being the guy who runs Deadspin. I should have asked for GQ to send someone else. Better yet, I should have stuck to my rules and only do interviews via email.
2008-01-24 15:49:00Mark Cuban U 4 )3 testtesting log in2008-02-06 12:59:01damian5 3! Massimowhatever2008-02-05 16:25:52Mark Cuban; 3;TESTtest2008-02-05 16:06:40mdipierro@cs.depaul.edul = e3!Is this ethical - Part 2Since the conversation on this topic was interesting, I thought it would be appropriate to add some more information and answer where I stand on the question. After all, I asked the question in my previous b : 53test789can i get a wootwoot2008-02-04 07:03:03mio log post, I didn't answer it.
First , my opening comments as Will and I sat down for the interview. (these come courtesy of Will in an email to me about this subject)
>> WL: Okay. I want to start off actually, this is going to beSo i made it clear that I wanted no association with his blog at all.
Does his writing a piece about me with a link back to the very item that he knew I wanted nothing to do with constitute a lack of ethics ? I think so. It certainly is a major fuck you.
Does makindatabases/f6db3e6e66dc0b6aea6b47a87ef29c1f_blogcomments.table 0000666 0000000 0000000 00000000565 10756166444 023731 0 ustar 00user group 0000000 0000000 (dp1 S'comment' p2 S'CHAR(32)' p3 sS'name' p4 S'CHAR(32)' p5 sS'author' p6 S'CHAR(32)' p7 sS'url' p8 S'CHAR(32)' p9 sS'blogpost_id' p10 S'CHAR(32)' p11 sS'indx' p12 S'CHAR(32)' p13 sS'timedate' p14 S'CHAR(32)' p15 sS'id' p16 S'INTEGER PRIMARY KEY AUTOINCREMENT' p17 sS'datetime' p18 S'TIMESTAMP' p19 sS'email' p20 S'CHAR(32)' p21 s. databases/f6db3e6e66dc0b6aea6b47a87ef29c1f_blogposts.table 0000666 0000000 0000000 00000000456 10756166444 023253 0 ustar 00user group 0000000 0000000 (dp1 S'numcomments' p2 S'INTEGER' p3 sS'author' p4 S'CHAR(32)' p5 sS'title' p6 S'CHAR(32)' p7 sS'datetime' p8 S'CHAR(32)' p9 sS'content' p10 S'CHAR(32)' p11 sS'post' p12 S'TEXT' p13 sS'timedate' p14 S'CHAR(32)' p15 sS'id' p16 S'INTEGER PRIMARY KEY AUTOINCREMENT' p17 s. databases/f6db3e6e66dc0b6aea6b47a87ef29c1f_user.table 0000666 0000000 0000000 00000000247 10752366002 022177 0 ustar 00user group 0000000 0000000 (dp1 S'verification' p2 S'CHAR(32)' p3 sS'password' p4 S'CHAR(32)' p5 sS'id' p6 S'INTEGER PRIMARY KEY AUTOINCREMENT' p7 sS'email' p8 S'CHAR(32)' p9 s. databases/sql.log 0000666 0000000 0000000 00000003016 10752366002 014456 0 ustar 00user group 0000000 0000000 timestamp: 2008-01-31T12:30:25.008000 CREATE TABLE blogposts( id INTEGER PRIMARY KEY AUTOINCREMENT, title CHAR(32), timedate CHAR(32), content CHAR(32) ); success! timestamp: 2008-01-31T12:30:25.086000 CREATE TABLE blogcomments( id INTEGER PRIMARY KEY AUTOINCREMENT, indx CHAR(32), name CHAR(32), timedate CHAR(32) ); success! timestamp: 2008-01-31T12:34:53.905000 ALTER TABLE blogposts ADD COLUMN post TEXT; success! timestamp: 2008-01-31T12:34:54.014000 ALTER TABLE blogposts ADD COLUMN datetime CHAR(32); success! timestamp: 2008-01-31T12:34:54.092000 ALTER TABLE blogcomments ADD COLUMN comment CHAR(32); success! timestamp: 2008-01-31T12:34:54.217000 ALTER TABLE blogcomments ADD COLUMN blogpost_id CHAR(32); success! timestamp: 2008-01-31T12:34:54.295000 ALTER TABLE blogcomments ADD COLUMN datetime TIMESTAMP; success! timestamp: 2008-01-31T18:10:10.140000 ALTER TABLE blogposts ADD COLUMN author CHAR(32); success! timestamp: 2008-01-31T18:10:10.250000 ALTER TABLE blogcomments ADD COLUMN author CHAR(32); success! timestamp: 2008-01-31T18:58:01.978000 ALTER TABLE blogcomments ADD COLUMN url CHAR(32); success! timestamp: 2008-02-02T06:43:25.664000 ALTER TABLE blogposts ADD COLUMN numcomments INTEGER; success! timestamp: 2008-02-06T08:34:11.594000 ALTER TABLE blogcomments ADD COLUMN email CHAR(32); success! timestamp: 2008-02-06T11:18:56.728000 CREATE TABLE user( id INTEGER PRIMARY KEY AUTOINCREMENT, email CHAR(32), password CHAR(32), verification CHAR(32) ); success! errors/ 0000777 0000000 0000000 00000000000 10756166365 012557 5 ustar 00user group 0000000 0000000 languages/ 0000777 0000000 0000000 00000000000 10756166365 013211 5 ustar 00user group 0000000 0000000 languages/it..py 0000666 0000000 0000000 00000000056 10745777322 014255 0 ustar 00user group 0000000 0000000 { 'Hello World':'', 'Welcome to web2py':'', } languages/it.py 0000666 0000000 0000000 00000000107 10745777322 014174 0 ustar 00user group 0000000 0000000 { 'Hello World':'Salve Mondo', 'Welcome to web2py':'Ciao da wek2py', } models/ 0000777 0000000 0000000 00000000000 10756166365 012526 5 ustar 00user group 0000000 0000000 models/db.py 0000666 0000000 0000000 00000002664 10752401340 013452 0 ustar 00user group 0000000 0000000 # try something like import datetime now=datetime.datetime.today() db=SQLDB("sqlite://db.db") db.define_table('blogposts', SQLField('title', length=64), SQLField('author', default=session.username), SQLField('datetime', 'datetime',default=now), SQLField('post', 'text'), SQLField('numcomments', 'integer',default=0)) db.blogposts.title.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db,db.blogposts.title)] db.blogposts.author.requires = IS_NOT_EMPTY() db.blogposts.post.requires = IS_NOT_EMPTY() db.define_table('blogcomments', SQLField('blogpost_id'), # the blogpost this comment belongs to SQLField('url', default=''), SQLField('email', default='you@something.com'), SQLField('author', default=session.username), SQLField('datetime', 'datetime',default=now), SQLField('comment', 'text')) db.blogcomments.author.requires = IS_NOT_EMPTY() db.blogcomments.comment.requires = IS_NOT_EMPTY() db.blogcomments.email.requires = IS_EMAIL() ##Identity module ### email is really the username since this ### particular version of Identity doesn't send email db.define_table('user', SQLField('email'), SQLField('password','password'), SQLField('verification',default='')) models/info.py 0000666 0000000 0000000 00000000163 10752157304 014020 0 ustar 00user group 0000000 0000000 # try something like response.title='My Blog' response.subtitle='I am therefore I blog' response.author='kensan' modules/ 0000777 0000000 0000000 00000000000 10756166365 012713 5 ustar 00user group 0000000 0000000 modules/__init__.py 0000666 0000000 0000000 00000000000 10745732752 015007 0 ustar 00user group 0000000 0000000 private/ 0000777 0000000 0000000 00000000000 10756166365 012715 5 ustar 00user group 0000000 0000000 scratch.txt 0000666 0000000 0000000 00000011472 10751061036 013420 0 ustar 00user group 0000000 0000000 ;; This buffer is for notes you don't want to save, and for Lisp evaluation. ;; If you want to create a file, visit that file with C-x C-f, ;; then enter the text in that file's own buffer.
This is image came from Morguefile
Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies. Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.
Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies.
An example of an unordered list:
Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.
Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies.
A blockquote:
Dynamically transform holistic initiatives and diverse technologies. Uniquely deliver highly efficient potentialities with global quality vectors. Appropriately expedite cross-unit services with professional intellectual capital. Professionally pursue maintainable outsourcing whereas 24/7 outsourcing. Distinctively innovate installed base metrics with tactical content. Dynamically generate sustainable bandwidth and resource maximizing functionalities.
Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.
Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies.
An example of an unordered list:
Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.
This is image came from Morguefile
Phosfluorescently redefine out-of-the-box best practices before timely expertise. Efficiently re-engineer inexpensive e-tailers with focused customer service. Enthusiastically synergize ubiquitous benefits for interactive methodologies. Credibly visualize integrated experiences through vertical best practices. Enthusiastically generate empowered technology and holistic total linkage. Assertively redefine resource-leveling solutions via accurate potentialities.
<--