4.odoo入门——培训签到课程项目(二),后端逻辑

来源:互联网 发布:淘宝宜家代购是真的吗 编辑:程序博客网 时间:2024/06/05 20:01

第4天:

遇到的问题:

发现了一个Python获取当前时间和其时区问题:

在odoo中插入数据库的记录中的时间对象都和我们东八区有8个时间的误差,后来才发现,在odoo10/start.py中定义了时间区间是UTC

__import__('os').environ['TZ'] = 'UTC'

那么如何修改成东八区呢?

我以为修改成”Asia/Shanghai”就可以,但是发现数据库记录中仍然是与我的时区相差八个小时,那么肯定还有其他地方是需要更多的修改,参考博客:

http://www.oschina.net/question/5189_3943

在尽量不修改odoo源代码的前提下,我就先不进行修改了,那么就自己手动解决时区问题:

在我们进行时间比较时,手动转化成时间戳模式,再进行比较

那么如果我们要进行提取数据库中的时间项呢,那肯定要进行转换成+8个小时之后的

Python中2个格式化时间的比较

解决方法(时间对象和时间戳的相互转换)参考链接:

http://blog.csdn.net/google19890102/article/details/51355282

实现转换如下: UTC时间对象——>时间戳——> + 8个时间——>转换成时间对象:

#从数据中取出时间对象,转化成时间戳,再加8小时

time_start_val = time.mktime(time.strptime(obj.time_start, "%Y-%m-%d %H:%M:%S")) + 8 *  60 * 60# 将数据库中的时间对象对应的时间戳转换回格式化字符串# 1,首先转换成localtimetime_start_local_val = time.localtime(time_start_val)# 2.#转换成新的时间格式(比如2016-05-05 20:28:54)true_time_start = time.strftime("%Y-%m-%d %H:%M:%S",time_start_local_val)

这样就完成了转化

在odoo平台开发中,我负责的是后端逻辑的编写,但是对写什么,怎么写,毫无头绪——感觉自己什么都不了解啊。后来根据我的了解到就是,一个项目下的其中2歌文件夹,分别是controllers和templates,文件目录如图所示:


 当我们打开templates中的页面时,controllers中的main.py会根据你所打开的页面根据路由信息调用对应的函数,返回相应的数据给前端——这是我目前了解到的套路,这可能跟jinja这个模版引擎有关(促使前后端分离),那么这个我们需要进行进一步的深入学习。可以先说说我的一个前端页面代码:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title></title></head><body><ul>    {% for item in data %}  <!-- json数组 -->    <li>课程名字:{{item.course}}-老师:{{item.teacher}}-时间是-{{item.time_start}}到{{item.time_end}}--描述:{{item.description}}-</li>    {% endfor %}</ul></body></html>

里面嵌套着一些jinja语法,那么data这个数据是从哪里来的呢,是在controllers/main.py中的MainController类中的一个函数:

@http.route('/ws_training/index', type='http', auth='public', csrf=False)def index(self, **kwargs):    #-------------找到最近的课程--------------#    course_model = http.request.env['ws.training.course'] #request对象其实是    course_list = course_model.sudo().search([]) #根据搜索条件得到记录    #if 判断到学生登陆了:  学生id 为 student_id    data_list = []    # 格式化成2016-03-20 11:45:39形式    #ourTimeZone = pytz.timezone('Asia/Shanghai')    currentTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))    for obj in course_list:  # 遍历list中的对象,每个对象其实是这个表中的一条记录        print "该条课程记录的课程开始时间是:",obj.time_start        # 将格式字符串转换为时间戳,时间间隔是以秒为单位的浮点小数        print currentTime        currentTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))        currentTimeVal = time.mktime(time.strptime(currentTime, "%Y-%m-%d %H:%M:%S"))        time_start_val = time.mktime(time.strptime(obj.time_start, "%Y-%m-%d %H:%M:%S")) + 8 *  60 * 60        time_end_val = time.mktime(time.strptime(obj.time_end, "%Y-%m-%d %H:%M:%S")) + 8 *  60 * 60        # 将数据库中的时间对应的时间戳转换回格式化字符串        # 1,首先转换成localtime        time_start_local_val = time.localtime(time_start_val)        time_end_local_val = time.localtime(time_end_val)        # 2.#转换成新的时间格式(2016-05-05 20:28:54)        true_time_start = time.strftime("%Y-%m-%d %H:%M:%S",time_start_local_val)        true_time_end = time.strftime("%Y-%m-%d %H:%M:%S",time_end_local_val)        if time_start_val >= currentTimeVal: #上课时间大于当前时间,签到是合法的 ——————简单模版            data_list.append({'teacher': obj.teacher_id.name,                              'course': obj.name,                              'time_start': true_time_start,                              'time_end': true_time_end,                              'description': obj.description,                              })    # print data_list    template = env.get_template("index.html")    return template.render(data=data_list)    #---------------作者:...——————————————————————————#

其主要功能是访问了数据库,然后通过一些逻辑处理之后得到数据,以列表的形式返回给前端。更多的了解可能需要jinja的深入了解了,未来有机会会继续深入学习。

而且,这个类也有一些特殊的性质:

class MainController(http.Controller): #Controller继承于object,它就定义了一个元类:ControllerType,目的:控制类的创建行为                                       #metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。                                       #元类会删除掉类中的所有类属性,目的就是避免造成混淆



原创粉丝点击