2010-02-16 10 views
8

मैं नियुक्तियों के लिए अन्य लोगों को निर्धारित करने की क्षमता के साथ एक कैलेंडर सिस्टम को लागू करने की कोशिश कर रहा हूं। सिस्टम को किसी अन्य नियुक्ति के दौरान या उनके अनुपलब्ध समय के दौरान किसी व्यक्ति को शेड्यूल करने से रोकने में सक्षम होना चाहिए।django कैलेंडर मुफ्त/व्यस्त/availabilitty

मैंने इंटरनेट पर मिली सभी मौजूदा डीजेंगो कैलेंडर परियोजनाओं को देखा है और उनमें से कोई भी इन्हें अंतर्निहित नहीं लगता है (अगर मैं इसे किसी भी तरह याद करता हूं, तो कृपया मुझे बताएं)।

शायद मैं बहुत थक गया हूं, लेकिन ऐसा करने का एकमात्र तरीका मैं इसे थोड़ा गन्दा लग रहा हूं। यहाँ छद्म कोड में चला जाता है:

  • एक उपयोगकर्ता एक नया नियुक्ति बनाने के लिए, नई नियुक्ति के start_time हड़पने और कहा कि एक ही दिन में प्रत्येक अपॉइंटमेंट के लिए end_time
  • करने का प्रयास करते, तो देखें कि
    • existing_start_time < NEW_START_TIME और मौजूदा_एंड_टाइम> new_start_time (नई नियुक्तियां किसी भी मौजूदा अपॉइंटमेंट की शुरुआत और समाप्ति के समय के बीच शुरू होती हैं)
    • मौजूदा_स्टार्ट_टाइम < new_end_time और मौजूदा_एंड_टाइम> new_end_time (नई नियुक्तियां एन है किसी भी मौजूदा नियुक्ति के प्रारंभ और समाप्ति समय के बीच में घ समय)
  • अगर कोई वस्तुओं पाए गए, तो आगे जाना है और नई नियुक्ति

जोड़ने को ध्यान में रखते Django समय के आधार पर कोई फ़िल्टरिंग है, यह सब करना होगा क्वेरीसेट पर .extra() का उपयोग करके किया जाना चाहिए।

तो, मैं पूछ रहा हूं कि कोई बेहतर तरीका है या नहीं। एक पाइथोनिक चाल या मॉड्यूल या कुछ भी जो इसे सरल बना सकता है। या एक मौजूदा परियोजना जिसमें मुझे चाहिए या मुझे सही दिशा में ले जाया जा सकता है।

धन्यवाद।

उत्तर

13

Django के range test का उपयोग करने के बारे में क्या।

उदाहरण के लिए:

appoinment = Appointment() 
appointment.start_time = datetime.datetime.now() 
# 1 hour appointment 
appointment.end_time = appointment.start_time + datetime.timedelta(hours=1) 
# more stuff here 
appointment.save() 

# Checking for collision 
# where the start time for an appointment is between the the start and end times 
# You would want to filter this on user, etc 
# There is also a problem if you book an appointment within another appointment 
start_conflict = Appointment.objects.filter(
        start_time__range=(appointment.start_time, 
             appointment.end_time)) 
end_conflict = Appointment.objects.filter(
        end_time__range=(appointment.start_time, 
            appointment.end_time)) 

during_conflict = Appointment.objects.filter(
         start_date__lte=appointment.start_time, 
         end_date__gte=appointment.end_time) 

if (start_conflict or end_conflict or during_conflict): 
    # reject, for there is a conflict 

कुछ इस तरह? मैंने इसे स्वयं नहीं किया है, इसलिए आपको इसे थोड़ा सा ट्विक करना पड़ सकता है।

संपादित करें:during_conflict बिट जोड़ा गया।

+1

+1 बहुत बढ़िया! देखा नहीं था कि रेंज परीक्षण Django के QuerySet API में बनाया गया था। –

+0

महान टिप के लिए धन्यवाद। यह ऐसी घटनाओं को याद कर रहा था जो नई नियुक्ति के बाद शुरू और समाप्त हो गए थे। उदाहरण के लिए: यदि किसी ग्राहक के पास 1 से 5 तक नियुक्ति होती है, तो यह किसी को 2 से 3 तक बुकिंग करने से नहीं रोकेगा। मैंने ऐसी स्थितियों को शामिल करने के लिए निम्नलिखित जोड़ा: दौरान_conflict = Appointment.objects.filter (start_date__lte = placement.start_time, end_date__gte = नियुक्ति।end_time) अगर (start_conflict या end_conflict या दौरान_conflict): – mhost

+0

उत्कृष्ट। मुझे खुशी है कि यह सहायक था। मैं आपका केस जोड़ने जा रहा हूं इसलिए उत्तर अधिक पूरा हो गया है। –

0

यहां एक चेतावनी अलग-अलग उपयोगकर्ताओं के अलग-अलग समय क्षेत्र हैं, और मिश्रण की चीजों में डेलाइट सेविंग टाइम लाएं बहुत जटिल हो जाते हैं।

आप टाइमज़ोन मुद्दे की देखभाल करने के लिए pytz मॉड्यूल पर एक नज़र डालना चाहेंगे।

संबंधित मुद्दे