项目标准化 之 “自学问卷”生产工具 EasyPaper

邮件技术部·项目管理组· ZoomQuiet

2005-06-09

1. 概述

EasyPaper 是在原先 内网自学问卷 系统基础上的加强

原先的自学问卷通过PHP页面组织题目,MySQL 记录答题情况,是非常实用的,但是没有问卷管理的功能,所有问卷是通过手工编辑页面完成的……

那未,我们马上跟随各种项目标准化活动中要大量的使用问卷来进行培训的话,什么样的问卷工具可以满足最基础的需求呢?

需求规约

  1. 问卷格式
    • 顺序答卷
    • 只有对才可以通过
  2. 方便的试题发布:
    • 简单的模板系统 可以快捷修改所有页面元素
    • 简明扼要的问卷内容记述模式,可以自由修改
    • 可以随时重新发布原先发布过的问卷
  3. 方便的成绩统计:
    • 按照问卷整理;谁,何时完成,成绩?

2. 设计

简单分析原有的问卷系统后,重新设计DB,和分折页面为模板后,自然的使用 Python 快捷组织代码,实现所有功能

其实只有一个功能:理解问卷的内容,然后自动生成一批问卷页面,发布出去!

首先利用Python 的灵活数据结构设计了问卷的记述:

   1 paper={
   2         "pname":"问卷名称,最好写明所属规范集合,比如说:项目管理标准化 之 “项目计划与控制流程” ",
   3         "desc":"问卷描述,版本号什么的",
   4         "complete":5, #多少道题
   5         "done":2, # 问卷状态 0:准备中|1:进行中|2:已发布
   6         "ask":(
   7                 ["1. “计划与控制流程”并不关注的项目活动是:",
   8                         [       ("a","备选答案1"),
   9                                 ("b","备选答案2"),
  10                                 ...
  11                         ],
  12                         "正确答案"],
  13 ...             )
  14         }

然后对应的,约定了config 文本格式的简化问卷定义格式:

# 以设置文件格式来声明问卷
# 注意所有标点符号,要使用中文的双字节字符!
[description]
pname           = 问卷名称,最好写明所属规范集合,比如说:项目管理标准化 之 “项目计划与控制流程”
desc            = 问卷描述,版本号什么的
complete= 多少道题
done            = 问卷状态 0:准备中|1:进行中|2:已发布
[ask1]# 题目栏 ask+顺序号
number          = 4 问题有多少选项
question= 题干
a               = 备选答案1
b               = 备选答案2
...
key             = a 正确答案
...

模板的处理,就利用Python 的文本替换功能,即最基础的打印格式化字串替换功能,来完成,无它……

3. 使用

使用是非常简便的,将设计好的问卷文件安放到专用目录,然后运行 "questionnaire.sh" 专门的组合工具调用脚本一切都自动执行了

3.1. 安装

环境

安装

├──adodb-py113  ADOdb for Python
│  └──adodb
│     ├  ...
│     └  setup.py       直接#python setup.py install
├──pm050531       原版问卷,纪念,不作使用
├  cfg2paper.py   .cfg 问卷设计文本解析脚本
├  commfunction.php  问卷回答响应脚本
├  conn.php       数据库连接PHP脚本
├  index.php      问卷总列表展示
├  questionnaire.leo 工程组织文件,使用Leo 管理所有代码的开发
├  questionnaire.py 问卷生产脚本
├  questionnaire.sh 综合调用shell
├──_cfg           问卷设计文本安装目录
├──_papers        问卷信息数据发布目录
│  └  __init__.py 自动模板文件加载脚本
└──_template      模板文件目录
   ├  ask-form.php
   ├  ...
   ├  paper-ask.py
   ├  ...
   └  questionnaire.sql DB库表设计文件

初始化DB

3.2. 管理

发布

问卷生产

  1. 将设计好的问卷 xxx.cfg 上传到 _cfg 目录中

  2. 运行 questionnaire.sh 脚本

  3. 将自动生成问卷到 xxx 目录,并组织到 index.php 中展示

问卷管理

  1. 问卷答过,投入历史,不作当前培训主题?
    • 修改问卷设计文本中 done 的值为 2

    • 重新运行 questionnaire.sh 脚本

    • 一切完成
  2. 要彻底清除问卷?
    • 假定对应的问卷设计文本是 a.cfg

    • 删除 _cfg 目录中的 a.cfg

    • 删除 _paper 目录中的 a.py

    • 重新运行 questionnaire.sh 脚本

    • 一切完成

4. 技术笔记

虽然整个思路简要,明确,又有 Python 这一得力语言,但是还是要使用一些高级技巧才可以完成任务

4.1. 模块自加载

   1 import sys,os,string
   2 import fnmatch
   3 # 自动声明所有模块
   4 # Define what gets imported with a 'from IPython import *'
   5 __all__ = []
   6 for f in os.listdir('_papers'):
   7         if fnmatch.fnmatch(f, '*.py'):
   8                 if ("__init__" in f):
   9                         pass
  10                 else:
  11                         __all__.append(string.split(f,".")[0])
  12 print __all__
  13 glob,loc = globals(),locals()
  14 for name in __all__:
  15         __import__(name,glob,loc,[])

4.2. 动态模块引用

4.2.1. __import__

4.3. 简要模板

可以使用 %(varName)s 的模式进行字串替换

</br>
<input type="radio" name="item" value="%(ppqvar)s">
%(ppqitem)s

   1 ff = open("paper.php","w")
   2 exp = ""
   3 template = open(ask-item.php,"r").read() 
   4 for item in question:
   5         ppqvar = item[1][0]
   6         ppqitem = item[1][1]
   7         exp +=template%locals()
   8 ff.write(exp)


动力源自:txt2tags


-- ZoomQuiet (2005-06-09)

EasyPaper (last edited 2009-12-25 07:09:23 by localhost)

Loading