Skip to content

Instantly share code, notes, and snippets.

@oyakata
Created July 9, 2011 05:43
Show Gist options
  • Save oyakata/1073367 to your computer and use it in GitHub Desktop.
Save oyakata/1073367 to your computer and use it in GitHub Desktop.
argparseでdjangoの管理コマンドを敢えて作る -- admin-userのlsとユーザー追加
# -*- coding:utf-8 -*-
import argparse
from django.core.management.base import handle_default_options
from django.utils import importlib
import csv
def is_noble(user):
"""があればTrueを返します。 """
if user.is_superuser:
return True
else:
return user.groups.filter(name="noble").count() != 0
def ls(args):
"""ユーザー情報の一覧をプリントします。 """
from django.contrib.auth.models import User
writer = csv.writer(args.log, delimiter="\t")
writer.writerow(("氏名", "user_id", "email", "root権限", "貴族特権"))
for user in User.objects.all().order_by("username"):
root = "あり" if user.is_superuser else "なし"
noble = "あり" if is_noble(user) else "なし"
seimei = user.get_full_name().encode("utf8")
row = (seimei or "<未設定>", user.username, user.email, root, noble)
writer.writerow(row)
def _add(username, email, password, is_superuser, is_noble, first_name, last_name):
"""ユーザー追加のヘルパーです。 """
from django.contrib.auth.models import User, Group
if is_superuser:
user_factory = User.objects.create_superuser
else:
user_factory = User.objects.create_user
new_user = user_factory(username, email, password)
new_user.is_staff = True
new_user.is_active = True
new_user.is_superuser = is_superuser
new_user.first_name = first_name
new_user.last_name = last_name
new_user.save()
if is_noble:
new_user.groups.add(Group.objects.get_or_create(name="noble")[0])
def add(args):
"""ユーザーを追加します(1件)。 """
username, email, password = args.user_id, args.email, args.password
is_superuser = args.root
first_name = args.first_name
last_name = args.last_name
is_noble = args.noble
_add(username, email, password, is_superuser, is_noble, first_name, last_name)
def add_many(args):
"""指定したcsvファイルを元にユーザーを追加します。 """
import re
reader = csv.reader(args.csv_file, delimiter=",")
for row in reader:
if not row:
# 空行はスキップする。
continue
row = [unicode(x, "utf-8") for x in row]
if row[0] == u"氏名":
# ヘッダー行とみなしてスキップする。
continue
seimei = row[0]
if seimei in (u"<未設定>", u""):
row[0] = u""
row.insert(1, u"")
else:
seimei = re.split(u"[  ]+", row[0]) + [u""]
row[0] = seimei[0]
row.insert(1, seimei[1])
username, email = row[2:4]
password = username
is_superuser, is_noble = [x.lower() in (u"true", u"あり", u"1") for x in row[4:6]]
first_name, last_name = row[0:2]
_add(username, email, password, is_superuser, is_noble, first_name, last_name)
def create_cmd():
"""コマンドのファクトリです。 """
import sys
parser = argparse.ArgumentParser(prog="user_cmd")
subparsers = parser.add_subparsers()
ls_cmd = subparsers.add_parser("ls", help="ユーザーの一覧を表示します。")
ls_cmd.set_defaults(func=ls)
add_cmd = subparsers.add_parser("add", help="waku2のユーザーを追加します。")
append = add_cmd.add_argument
append("user_id")
append("email")
append("password")
append("--root", action="store_true", help="superuser権限を与えます。")
append("--noble", action="store_true", help="貴族特権を与えます。")
append("--firstname", action="store", type=str, help="姓", dest="first_name", default="")
append("--lastname", action="store", type=str, help="名", dest="last_name", default="")
add_cmd.set_defaults(func=add)
add_many_cmd = subparsers.add_parser("addmany", help="csvファイルからユーザーを投入します。")
append = add_many_cmd.add_argument
append("csv_file", type=argparse.FileType('r'), help="ユーザー定義を記入したcsvファイル。")
add_many_cmd.set_defaults(func=add_many)
for cmd in subparsers.choices.values():
cmd.add_argument("--settings")
cmd.add_argument("--pythonpath", default=".")
cmd.add_argument('--log', type=argparse.FileType('w'), default=sys.stdout,
help="コンソール出力先です。")
return parser
def main():
import sys
args = sys.argv[1:]
cmd = create_cmd().parse_args(args)
handle_default_options(cmd)
conf = cmd.settings
importlib.import_module(conf)
from django.db import transaction
transaction.commit_on_success(cmd.func)(cmd)
if __name__ == '__main__':
main()
[buildout]
parts = init
develop = apps
[init]
recipe = zc.recipe.egg
eggs =
argparse
MySQL-python
django==1.3
apps
dependent-scripts = true
interpreter = py
from setuptools import setup, find_packages
setup(
name="apps",
packages=find_packages(),
entry_points="""
[console_scripts]
adminuser = commands.adminuser:main
"""
)
氏名 user_id email root権限 貴族特権
今川 義元 root imagawa@boo.zoo あり あり
朝比奈 泰能 asahina asahina@boo.zoo あり なし
瀬名 氏俊 sena sena@boo.zoo なし あり
今川 氏真 ujizane ujizane@boo.zoo なし あり
<未設定> anonymous foo@bar.baz なし なし
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment