class GiveProductAdmin(admin.ModelAdmin):
list_display = ('rolename', 'server', 'product', 'status', 'logdate')
readonly_fields = ('status', 'logdate')
def has_delete_permission(self, request, obj=None):
return False
def has_change_permission(self, request, obj=None):
"""
@des:注意这里虽然有修改权限,但是是为了查看,在save_model里面做修改,让其没有修改权限
"""
return True
def response_add(self, request, obj, post_url_continue=None):
"""
@des:这里可以自定义 创建对象后的 出错信息-----修改对象用response_change, 删除对象用resonse_delete
"""
#如果有出错消息
if messages.get_messages(request):
return HttpResponseRedirect(".")
#end--如果没有出错消息
return super(GiveProductAdmin, self).response_add(request, obj, post_url_continue)
def response_change(self, request, obj):
"""
@des:这里可以自定义 创建对象后的 出错信息-----修改对象用response_change, 删除对象用resonse_delete
"""
#如果有出错消息
if messages.get_messages(request):
return HttpResponseRedirect(".")
#end--如果没有出错消息
return super(GiveProductAdmin, self).response_change(request, obj)
def save_model(self, request, obj, form, change):
"""
@des:修改本model的数据
@超级坑: save_model是在事务里面执行的,所以,除了这个方法执行完后,才会有订单,订单记录等,被坑惨了, 就算transaction.savepoint_commit都不行
"""
if change is False:#是创建--那么执行补单逻辑
cp,cpname = 100, 'gpt' #手动补单的渠道
#获取服务器对象
Gs = get_model('ckauth', 'GameServer')
serverORM = Gs.objects.get(id=obj.server)
#end--获取服务器对象
#判断玩家存不存在
rolename = obj.rolename.encode('utf-8')
req = urllib2.Request("http://%s:%s/getplayerbync1451xxx/" % (serverORM.ip,serverORM.hport))
fd = urllib2.urlopen(req, urllib.urlencode({'pwd':'145278', 'nc':rolename}), timeout=5)
rdata = fd.read()
fd.close()
rdata = json.loads(rdata)
if rdata['s']!=1:
messages.error(request, u'角色不存在')
return
rid,uid = rdata['rid'],rdata['uid']
#end--判断玩家存不存在
#创建订单
oid = "%s" % ((uuid.uuid4()).hex,)
oobj = Orderform.objects.create(
orderId=oid,
channel_number=cp,
server=serverORM,
roleId=rid,
produce_id=obj.product,
status=0
)
#end--创建订单
#创建充值记录
c_payobj = payforc.getItemById(obj.product)
amount = int(c_payobj['c_pay'])
real_ext = {'rid':rid, 'eid':obj.product, 'oid':oid}
ext = "%s"%real_ext
probj = PayRecord.objects.create(
username=uid,
gold=float(amount),
orderId=oid,
server=serverORM,
status=0,
ext=ext,
channel_number=cpname
)
# #创建保存点
# spid = transaction.savepoint()
# transaction.savepoint_commit(spid)
# #end--创建保存点
#end--创建充值记录
# 订单投递到对应游戏服务器发放代币
req = urllib2.Request("http://%s:%s/sy/game/payRecord/" % (serverORM.ip,serverORM.hport))
mm = hashlib.md5()
mm.update("%s%s%s" % (oid, ext, settings.PAY_GAME_KEY))
fd = urllib2.urlopen(req, urllib.urlencode({'oid': oid, 'ext': ext, 'flag': mm.hexdigest(), 'cp': cpname}), timeout=5)
data = fd.read()
fd.close()
if int(data) != 1:
obj.status=2
messages.error(request, u'游戏服验证失败')
else:
obj.status=1
oobj.status = 1
probj.status = 1
oobj.save()
probj.save()
# 返回状态代码给支付平台
obj.save()
else:#如果是修改,那么不允许修改
messages.error(request, u'不允许修改')