Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

# Copyright (C) 2015 Chintalagiri Shashank 

# 

# This file is part of Tendril. 

# 

# This program is free software: you can redistribute it and/or modify 

# it under the terms of the GNU Affero General Public License as published by 

# the Free Software Foundation, either version 3 of the License, or 

# (at your option) any later version. 

# 

# This program is distributed in the hope that it will be useful, 

# but WITHOUT ANY WARRANTY; without even the implied warranty of 

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

# GNU Affero General Public License for more details. 

# 

# You should have received a copy of the GNU Affero General Public License 

# along with this program.  If not, see <http://www.gnu.org/licenses/>. 

""" 

This file is part of tendril 

See the COPYING, README, and INSTALL files for more information 

""" 

import os 

import re 

import csv 

 

from tendril.utils.config import PROJECTS_ROOT 

from tendril.gedaif import conffile 

 

 

def is_project_folder(folder): 

    try: 

        conffile.ConfigsFile(folder) 

    except conffile.NoGedaProjectError: 

        return False 

    return True 

 

 

def parse_total_costing(filename): 

    with open(filename, 'r') as f: 

        reader = csv.reader(f) 

        header = None 

        for line in reader: 

            if line[0] == 'Ident': 

                header = line 

                break 

        if header is None: 

            raise ValueError 

        costt = 0 

        identc = 0 

        uncostedc = 0 

        for line in reader: 

            if line[0] is not None: 

                if line[header.index('Line Price')].strip() == '': 

                    uncostedc += 1 

                else: 

                    costt += float(line[header.index('Line Price')]) 

                identc += 1 

        return costt, identc, uncostedc 

 

 

def get_card_indicative_cost(cardname): 

    projectfolder = cards[cardname] 

    pricingfolder = os.path.join(projectfolder, 'doc', 'pricing') 

    if not os.path.exists(pricingfolder): 

        return None 

    allfiles = os.listdir(pricingfolder) 

    pfrex = re.compile(cardname + "~(.*).csv") 

    pfiles = [os.path.join(pricingfolder, x) 

              for x in allfiles if pfrex.match(x)] 

    contextc = len(pfiles) 

    if contextc == 0: 

        return None 

    costt = 0 

    for fpath in pfiles: 

        rval = parse_total_costing(fpath) 

        costt += rval[0] 

    costt /= contextc 

    return costt 

 

 

def get_projects(basefolder=None): 

    lcards = {} 

    lpcbs = {} 

    lprojects = {} 

    lcard_reporoot = {} 

 

    if basefolder is None: 

        basefolder = PROJECTS_ROOT 

 

    for root, dirs, files in os.walk(basefolder): 

        dirs[:] = [d for d in dirs 

                   if not d.endswith('.git') and not d.endswith('.svn')] 

        for d in dirs: 

            if is_project_folder(os.path.join(root, d)): 

                lprojects[ 

                    os.path.relpath(os.path.join(root, d), basefolder) 

                ] = os.path.join(root, d) 

                cf = conffile.ConfigsFile(os.path.join(root, d)) 

                if cf.configdata['pcbname'] is not None: 

                    lpcbs[cf.configdata['pcbname']] = os.path.join(root, d) 

                for config in cf.configdata['configurations']: 

                    lcards[config['configname']] = os.path.join(root, d) 

                    lcard_reporoot[ 

                        config['configname'] 

                    ] = os.path.relpath(os.path.join(root, d), basefolder) 

 

    return lprojects, lpcbs, lcards, lcard_reporoot 

 

 

projects, pcbs, cards, card_reporoot = get_projects()