Large Conference Management A DT3 User Case Study

Hi, I’m now using DT3 pro to manage a large conference. I have a database dedicated to this “program” and under it several groups, naming a presentation group, a visual materials group (subgroup including pictures, videos, documents, etc.), an online group (where I store collaborative bookmarks). Here is the structure:

  • Conference (Database)
    • Presentation
      • Dec 12th
      • Dec 13th
      • Dec 14th
      • Dec 15th
    • Materials
      • Videos
      • Pictures
        • LOGOs
        • Portraits
      • Documents

Of course, this is pretty simplified, I just want to know if you guys have further advice on my organization, especially on any additional feature I can leverage to simplify my management workflow.

1 Like

Looks good. The good thing about DEVONthink is that the structure of Groups doesn’t really matter to DEVONthink very much. All down to what you, the user, sees as a structure that meets your view of how your work is structured. DEVONthink does not work like a paper filing cabinet, or macOS Finder, for that matter, where there must be a choice where the document is placed.

You can always change the structure when your needs or perceptions change.

At a very first glance the only thing I’d probably do if for no other reason than to simplify and to exploit a DEVONthink feature is have one Group for “Presentations” and make “Smart Groups” for the presentation dates based rules which look at meta data (or contents) of the presentations.

I know this is just a “turn of a phrase”, but I hope that DEVONthink is not “managing” your project. It’s storing documents related to your project, but there are so many other things involving a project to manage a large conference (after having been there done that with other large projects).

2 Likes

Maybe this script is useful. It’s a variation of Script: Create custom date register.

It creates a group structure depending on property theDateFormat and property theMinutesToAdd.

Example output with theMinutesToAdd set to 60 :

Note: In the second dialog you’ll have to set the end date to your desired end date plus one day.

-- Create custom date register (with time)

-- Date Format Patterns:		https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns

-- Examples:
-- "yyyy/yyyy-MM/yyyy-MM-dd" --> 2021/2021-03/2021-03-01
-- "'Random string' yyyy/'Test' yyyy-MM/yyyy-MM-dd" --> Random string 2021/Test 2021-03/2021-03-01
-- "yyyy/yyyy-MM/dd. MMMM yyyy" --> 2021/2021-03/01. März 2021
-- "yyyy/QQQ yyyy/yyyy-MM/yyyy-MM-dd" --> 2021/Q1 2021/2021-03/2021-03-01
-- "YYYY/'KW' ww YYYY/YYYY-MM-dd, E" --> 2021/KW 09 2021/2021-03-01, Mo.
-- "e EEEE/yyyy-MM/yyyy-MM-dd" --> 1 Montag/2021-03/2021-03-01

-- Note: If you use a slash "/" make sure to escape it "\\/"

use AppleScript version "2.4"
use framework "Foundation"
use scripting additions

property createGroups : true -- set to false while testing 
property theDateFormat : "LLL d/LLL d - HH':'mm" --> Dez 5/Dez 5 - 01:00
property theMinutesToAdd : 60 -- 1 hour

set theCalendar to current application's NSCalendar's currentCalendar()
set theCalendarOptions to current application's NSCalendarMatchNextTime
set theDefaultStartDate to current application's NSDate's |date|()
set theDateComponents to current application's NSDateComponents's alloc()'s init()
set theDateComponents's |day| to 1
set theDateComponents's |month| to 1
set theDefaultEndDate to theCalendar's nextDateAfterDate:theDefaultStartDate matchingComponents:theDateComponents options:theCalendarOptions
set theDateFormatter to current application's NSDateFormatter's alloc()'s init()
set theDateFormatter's timeZone to (current application's NSTimeZone's timeZoneWithName:"GMT")
set theDateFormatter's dateFormat to "yyyy-MM-dd"

tell application id "DNtp"
	try
		if not (exists viewer window 1) then error "Please open a window"
		
		activate
		
		set theStartDate to missing value
		repeat while theStartDate = missing value
			set theStartDate to theDateFormatter's dateFromString:(display name editor "Create Register" info "Start Date:" default answer ¬
				(theDateFormatter's stringFromDate:theDefaultStartDate) as string)
		end repeat
		
		set theEndDate to missing value
		repeat while theEndDate = missing value
			set theEndDate to theDateFormatter's dateFromString:(display name editor "Create Register" info "End Date:" default answer ¬
				(theDateFormatter's stringFromDate:theDefaultEndDate) as string)
		end repeat
		
	on error error_message number error_number
		if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
		return
	end try
end tell

set theNSOrderedAscending to current application's NSOrderedAscending
if (theStartDate's compare:theEndDate) ≠ theNSOrderedAscending then set {theStartDate, theEndDate} to {theEndDate, theStartDate}

set theDateComponents's |month| to 0
set theDateFormatter's dateFormat to theDateFormat
set thisDate to theStartDate
set theDateStringArray to current application's NSMutableArray's arrayWithArray:{theDateFormatter's stringFromDate:theStartDate}

repeat
	if theMinutesToAdd > 0 then
		repeat
			set theDateComponents's |day| to 0
			set theDateComponents's minute to theMinutesToAdd
			set thisDate to (theCalendar's dateByAddingComponents:theDateComponents toDate:thisDate options:theCalendarOptions)
			
			if (theEndDate's compare:thisDate) ≠ theNSOrderedAscending then
				(theDateStringArray's addObject:(theDateFormatter's stringFromDate:thisDate))
			else
				exit repeat
			end if
		end repeat
	end if
	
	set theDateComponents's |day| to 1
	set theDateComponents's minute to 0
	set thisDate to (theCalendar's dateByAddingComponents:theDateComponents toDate:thisDate options:theCalendarOptions)
	
	if (theEndDate's compare:thisDate) ≠ theNSOrderedAscending then
		(theDateStringArray's addObject:(theDateFormatter's stringFromDate:thisDate))
	else
		exit repeat
	end if
end repeat

if createGroups = true then
	
	script s
		property theLocations : missing value
	end script
	
	set s's theLocations to theDateStringArray as list
	
	tell application id "DNtp"
		try
			set theDatabase to current database
			set theGroup to current group
			if theGroup ≠ root of theDatabase then
				set theGroupName to name of theGroup
				if theGroupName contains "/" then set theGroupName to my escapeSlash(theGroupName)
				set theGroupLocation to location of theGroup & theGroupName & "/"
			else
				set theGroupLocation to "/"
			end if
			set theContainerName to "Register"
			
			if exists record at theGroupLocation & theContainerName in theDatabase then
				set theDateFormatter's timeZone to current application's NSTimeZone's localTimeZone()
				set theDateFormatter's dateFormat to "yyyy-MM-dd HH.mm.ss"
				set theContainerName to theContainerName & space & ((theDateFormatter's stringFromDate:(current application's NSDate's |date|())) as string)
			end if
			
			show progress indicator "Creating Register... " steps (count (s's theLocations)) as string with cancel button
			
			repeat with thisLocation in s's theLocations
				step progress indicator thisLocation as string
				create location theGroupLocation & theContainerName & "/" & thisLocation as string in theDatabase
			end repeat
			
			hide progress indicator
		on error error_message number error_number
			hide progress indicator
			if the error_number is not -128 then display alert "DEVONthink" message error_message as warning
			return
		end try
	end tell
	
else
	set theDateStringList to theDateStringArray as list
	return item 1 of theDateStringList
end if

on escapeSlash(theText)
	set d to AppleScript's text item delimiters
	set AppleScript's text item delimiters to "/"
	set theTextItems to every text item of theText
	set AppleScript's text item delimiters to "\\/"
	set theText_escaped to theTextItems as string
	set AppleScript's text item delimiters to d
	return theText_escaped
end escapeSlash

1 Like

Hi, rmschne,

My issue with the current management workflow is that I don’t know where to put those raw materials, especially those come with various naming conventions and delivered in a galaxy of file types.

I haven’t tried running a conference this way, but I quite often use DT to plan attendance and then take and organise notes during the conference itself, which presents some of the same challenges. Among features which could be useful:

  1. Tags are particularly useful for creating a navigable document hierarchy independent of the hierarchy of Groups. You might find that tagging documents in your Materials group with dates and session timeslots is a good way to navigate materials by where they fit in the programme.
  2. Replicants are a useful fallback solution when you have items which clearly need to be in more than one Group.
  3. It can be really helpful to have either a Sheet or (my current preference) a Markdown table of the overall programme in a timetable grid, each cell of which can embed a link to a master document (e.g. in Markdown) collecting all the document links needed for that session with whatever additional notes you need. This could be a single document with links to different locations within it, or a separate document for each session; in the latter case, you can transclude them all in an overall host document to keep track of them.

But there are lots of ways to do this; the key thing is just to evolve a system and a workflow that you feel comfortable with, which may well include none of the above…

3 Likes

Hi, Nick,

I find your suggestion strongly useful. Especially your advice on adding “date” tag to my conference files. I regret I don’t meet you before. In terms of the hierarchy, do you have any other suggestions, I don’t know if I’m over worrying, but I feel like my hierarchy is still kind of redundant.

Yea, my hunch is that you are over-worrying this and the hierarchy may be redundant. Or not. You can use tags. You can use groups. You can use smart groups that filter based on tags, meta-data, or content. You can use some or all. Try a few things and then see if you can extract back out from your document store what you need/want. If not, adjust.