def getMessage(msgidx, readStamp=True): """ 쪽지를 읽어온다 """ mData = Archive("MsgInBox").getValues(msgidx, "Content,Receiver,Sender,Attachments,IsRead") if mData == None: raise SpartaUserError("존재하지 않는 쪽지번호 입니다") if mData["Receiver"] != Login.getID() and mData["Sender"] != Login.getID(): raise SpartaUserError("메세지를 볼수있는 권한이 없습니다") if readStamp and (mData["IsRead"] == False): # 스탬핑 처리 Archive("MsgInBox").Edit(msgidx, IsRead=True) # 보낸 편지에도 읽기 스템핑 r_idx = Archive("MsgSent").getValue("MsgSent.RelateIDX == "+str(msgidx), "IDX") if r_idx: Archive("MsgSent").Edit(r_idx, IsRead=True) outText = mData["Content"] if mData["Attachments"]: outText += u'<table class="filedownBox"><tr><td>첨부</td><td><a href="/getfile/message/%s">%s</a></td></tr></table>' % ( msgidx, mData["Attachments"]) return outText
def removeMessage(msgidx): mData = Archive("MsgInBox").getValues(msgidx, "Receiver,Sender,Attachments") if mData == None: raise SpartaUserError("존재하지 않는 쪽지번호 입니다") if mData["Receiver"] != Login.getID() and (not CheckAdmin()) and mData["Sender"] != Login.getID(): raise SpartaAccessError("메세지를 삭제할 수 있는 권한이 없습니다") r = Archive("MsgInBox").Remove( msgidx ) #[TODO] 파일삭제 처리!!! return r
def sendMessage( receiver, subject, content, attachments=None, withSMS=None ): """ 쪽지함에 쪽지를 발송 """ #[TODO] To,CC,BCC에 대한 처리 필요 #[TODO] IF not logined !! smsList = [] msgIDXs = [] msgSave = { "Subject": subject, "Content": content, "Sender": Login.getID(), "SenderName": Login.getName() } if "<" in receiver: #ex) Address Parsing :: "정기영" <*****@*****.**>, "김태희" <*****@*****.**> -> ["*****@*****.**", "*****@*****.**"] addrsList = re.findall("\<([._,a-zA-Z0-9:\#\@]+)\>+", receiver) else: addrsList = [n.strip() for n in receiver.split(",")] for recID in addrsList: userData = Archive("User").getValues( "User.UserID == "+ recID, "Name,HandPhone" ) if userData: msgSave["Receiver"] = recID result_IDX = Archive("MsgInBox").New(**msgSave) if result_IDX: msgIDXs.append( result_IDX ) if userData["HandPhone"] and not userData["HandPhone"].replace("-","") in smsList: smsList.append( str(userData["HandPhone"].replace("-","")) ) sentMsg = { "RelateIDX": result_IDX, "Subject": subject, "Content": content, "Receiver": recID, "ReceiverName": userData["Name"], "Sender": Login.getID() } r = Archive("MsgSent").New( **sentMsg ) if attachments: #[TODO] 임시 코드입니다. 멀티센딩에서 업된 파일에 대한 레퍼런스 카운트가 이상적이나 일단 그냥 복제형태로 갑니다. if type(attachments) == unicode: attachments = attachments.encode("utf8") uploadFile = Files.getRootDir() + attachments fileName = os.path.split(attachments)[1] if os.path.exists( uploadFile ): for ridx in msgIDXs: if str(ridx).isdigit(): targetFile = "/data/message/%s.%s" % ( fileName, ridx ) shutil.copy2( uploadFile, Files.getSpartaDir() + targetFile ) msgMod = { "IDX" : ridx, "Attachments" : "%s" % fileName } r = Archive( "MsgInBox" ).New( **msgMod ) os.remove(uploadFile) if withSMS and smsList: SMS.send( sendMsg=u"스팔타쪽지>"+msgSave["Subject"], recvList=smsList ) return len(msgIDXs)
def removeMessage(msgidx): msg_receiver_q = Session.query(MsgReceiver).filter_by(idx = msgidx).first() if None == msg_receiver_q: raise SpartaUserError("존재하지 않는 쪽지입니다") # 로그인한 사용자가 메시지를 받은 사용자가 아닌 경우 삭제할 수 없다는 메시지를 출력하게 한다. if msg_receiver_q.ReceiverID != Login.getID() and (not CheckAdmin()): raise SpartaAccessError("메시지를 삭제할 수 있는 권한이 없습니다") msg_receiver_q.IsDelete = u"1" Session.commit() # 항상 1을 반환한다. return 1
def setPassword( userid, newpassword): if userid != Login.getID() and (not CheckAdmin()): raise SpartaAccessError("패스워드를 변경할수 있는 권한이 없습니다.") useridx = getIDX( userid ) if useridx: hashedPass = hashlib.md5( newpassword ).hexdigest() r = 0 < Archive("User").Edit( useridx, Password=hashedPass ) else: raise SpartaError("[버그] 아이디의 IDX 정보가 잘못되었습니다.") if r: return True else: raise SpartaError("패스워드를 수정하지 못했습니다.")
def cancelMessage(sentidx): mData = Archive("MsgSent").getValues(msgidx, "RelateIDX,Sender,Attachments") if mData == None: raise SpartaUserError("존재하지 않는 쪽지번호 입니다") if mData["Sender"] != Login.getID() and (not CheckAdmin()): raise SpartaUserError("메세지를 삭제할 수 있는 권한이 없습니다") rData = Archive("MsgInBox").getValue( mData["RelateIDX"], "IDX,IsRead") if rData: if rData["IsRead"] == False: return removeMessage( rData["IDX"] ) else: raise SpartaUserError("발송된 메세지는 이미 읽은 메세지입니다") else: raise SpartaUserError("발송된 메세지는 이미 삭제되었습니다") return int(0)
def getMessage(msgReceiver_idx, readStamp=True): """ 쪽지를 읽어온다 """ msgReceiver_q = Session.query(MsgReceiver).outerjoin(Msg).add_entity(Msg) msg = msgReceiver_q.filter(MsgReceiver.idx == msgReceiver_idx).first() if None == msg: raise SpartaUserError("존재하지 않는 쪽지입니다") # 로그인 중인 사용자와 메시지를 받은 사용자 ID를 비교하여 일치하지 않으면 권한 오류를 발생시킨다. if Login.getID() != msg[0].ReceiverID: raise SpartaUserError("메시지를 볼 수 있는 권한이 없습니다") # 읽음여부 수정 if u"0" == msg[0].IsRead: msg[0].IsRead = u"1" Session.commit() outText = msg[1].Content # 첨부파일 가져오기 msgAttach_q = Session.query(MsgAttach).filter_by(Msg_IDX = msg[1].idx).all() attach_text = [] if len(msgAttach_q) > 0: attach_text.append("<table class=\"filedownBox\">") attach_text.append(u"<tr><td rowspan=\"%d\">첨부</td><td>" % len(msgAttach_q)) for attach_item in msgAttach_q: attach_text.append("<a href=\"/getfile/nmessage/%d\">%s</a><br />" % (attach_item.idx, attach_item.OriginalFileName) ) attach_text.append("</td></tr></table>") attach_text = "".join(attach_text) return "<p>%s</p>%s" % (outText, attach_text)
def removeSendMessage(sendidx): # 메시지 정보를 가져온다. msg_q = Session.query(Msg).filter(Msg.idx == sendidx) if msg_q.count() == 0: raise SpartaUserError("존재하지 않는 쪽지입니다") msg = msg_q.first() if msg.SenderID != Login.getID() and (not CheckAdmin()): raise SpartaAccessError("메시지를 삭제할 수 있는 권한이 없습니다") # 수신자 지우기 receiver_q = Session.query(MsgReceiver).filter(MsgReceiver.Msg_IDX == sendidx) if receiver_q.count() > 0: # 수신자중에 한명이라도 메시지를 읽지 않았다면 쪽지를 삭제하지 못하게 한다. for receiver_user in receiver_q.all(): if receiver_user.IsDelete == u"0": return u"%s 사용자가 아직 쪽지를 읽지 않았습니다" % receiver_user.ReceiverID receiver_q.delete() Session.commit() # 우선 첨부파일 정보를 가져온다. attach_q = Session.query(MsgAttach).filter(MsgAttach.Msg_IDX == sendidx).all() if len(attach_q) > 0: for attach_info in attach_q: # File Exists if os.path.exists(attach_info.NewFileName): os.unlink(attach_info.NewFileName) Session.delete(attach_info) Session.commit() # 본 메시지 삭제 msg_q = Session.delete(msg) Session.commit() return 1
def getNoReadCount(): """ 읽지않은 쪽지 갯수를 반환한다 """ return Session.query(MsgReceiver).filter(and_(MsgReceiver.IsRead == u'0', MsgReceiver.ReceiverID == Login.getID())).count()
def sendMessage( receiver, receiverCC, receiverBCC, subject, content, attachments=None, withSMS=None ): """ 쪽지함에 쪽지를 발송""" #[TODO] IF not logined !! withEmail = True emailList = [] smsList = [] msgIDXs = [] receiverTo = getReceiver(receiver) receiverCc = getReceiver(receiverCC) receiverBcc = getReceiver(receiverBCC) # 쪽지 내용 저장 msg = Msg() msg.SenderID = unicode(Login.getID()) msg.SenderName = unicode(Login.getName()) msg.Subject = unicode(subject) msg.Content = unicode(content) msg.withSMS = unicode(withSMS) msg.CreateDate = datetime.datetime.now() Session.add(msg) Session.commit() # To들에게 보내기 setMsgReceiver(receiverTo, msg.idx, "0") # CC들에게 보내기 setMsgReceiver(receiverCc, msg.idx, "1") # BCC들에게 보내기 setMsgReceiver(receiverBcc, msg.idx, "2") # SMS 발송 관련 처리 if withSMS: smsList = list() receiverList = receiverTo + receiverCc +receiverBcc for msg_receiver in receiverList: if type(msg_receiver) != dict: continue smsList.append(msg_receiver["HandPhone"]) if len(smsList) > 0: SMS.send(sendMsg=u"[sparta] %s" % msg.Content[:70], recvList=smsList) if withEmail: senderData = getReceiver("<%s>" % Login.getID())[0]["GwID"] emailList = list() receiverList = receiverTo + receiverCc +receiverBcc for msg_receiver in receiverList: if type(msg_receiver) != dict: continue if str(msg_receiver["GwID"]).startswith("D"): emailList.append( str(msg_receiver["GwID"])+"@idea.co.kr" ) if len(emailList) > 0: sendEmail("*****@*****.**" % senderData, msg.Subject, msg.Content, recvList=emailList) if attachments: objUpload = Upload() objUpload.MsgInitialize() for attach_item in attachments: new_file = objUpload.upload_file_move(attach_item) rowMsgAttach = MsgAttach() rowMsgAttach.Msg_IDX = unicode(msg.idx) rowMsgAttach.OriginalFileName = unicode(new_file["O_PATH"]) rowMsgAttach.NewFileName = unicode(new_file["D_PATH"]) rowMsgAttach.FileSize = unicode(new_file["SIZE"]) Session.add(rowMsgAttach) Session.commit() return len(receiverTo)
def getLoginID(): return Login.getID()
def getNoReadCount(): """ 읽지않은 쪽지 갯수를 반환한다 """ CntNonRead = Archive.RunQuery("select count(IDX) from MsgInBox where Receiver = :id and IsRead =0", id=Login.getID() )[0][0] return CntNonRead